excel - 解决 Excel 中生成的 .Bat 的 VBA 类型不匹配问题
问题描述
我有一个电子表格,可以在其中输入数据。文件名、时间和大量信息最终会生成一个 Windows 批处理文件。
我的 excel 公式的最终结果的图像 我的 excel 公式的最终结果的文本表示
Column-I Column-J Column-K
echo f | xcopy /f /y \\server123\data\3838383.398 %userprofile%\Desktop\VT\3838383.398
echo f | xcopy /f /y \\server123\data\3838384.398 %userprofile%\Desktop\VT\3838384.398
echo f | xcopy /f /y \\server123\data\3838385.398 %userprofile%\Desktop\VT\3838385.398
话虽如此,我有大约 30 行输入信息。有时我只需要 1 行。当我这样做时,剩余的 29 行将被 #VALUE! 填充。所以当我只有 1 行数据放入电子表格时,它看起来像这样(下图)。
Column-I Column-J Column-K
echo f | xcopy /f /y \\server123\data\3838383.398 %userprofile%\Desktop\VT\3838383.398
echo f | xcopy /f /y #VALUE! #VALUE!
echo f | xcopy /f /y #VALUE! #VALUE!
echo f | xcopy /f /y #VALUE! #VALUE!
然后我使用这个公式将 I、J、K 列连接到 Z 列=CONCATENATE(I5,J5," ",K5)
这就是魔术发生的地方,我有一个宏,可以将 Z 列中的任何内容转换为 windows .bat 文件。这是代码:
Sub Send2Bat()
Dim ColumnNum: ColumnNum = 26 ' Column Z - I have the I J and K Columns concatenated there.
Dim RowNum: RowNum = 0
Dim objFSO, objFile
Dim openBat As Object
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.CreateTextFile("C:\Users\UserProfile\Desktop\VT\Batch Files\Convert.bat") 'Output Path
aFile = "C:\Users\UserProfile\Desktop\VT\Batch Files\"
Dim OutputString: OutputString = ""
Dim targetSheet As Worksheet
Set targetSheet = Application.Worksheets("ForBatchFile")
Dim LastRow: LastRow = targetSheet.Cells(targetSheet.Rows.Count, ColumnNum).End(xlUp).Row
Do
RowNum = RowNum + 1
If Not (IsEmpty(targetSheet.Cells(RowNum, ColumnNum).Value)) Then
OutputString = OutputString & Replace(targetSheet.Cells(RowNum, ColumnNum).Value, Chr(10), vbNewLine) & vbNewLine
End If
Loop Until RowNum = LastRow
objFile.Write (OutputString)
Set openBat = CreateObject("Shell.Application")
openBat.Open (aFile)
Set objFile = Nothing
Set objFSO = Nothing
End Sub
当我填写了所有 30 行时,一切正常。我的问题是当我不这样做并且某些单元格包含#VALUE!
其中时,它不会输出 .bat 文件。我收到“运行时错误'13':类型不匹配”错误。这在某种程度上是意料之中的,因为它是电子表格将各种内容与日期、文本和一般格式连接起来。我想知道的是......我怎样才能更改我的宏,以便它只处理我需要的行而不会出错。我试过让我的变量变体类型,看看是否有帮助,当然没有。此外,我该如何处理错误并跳过检测到类型不匹配的行?我希望这是足够的细节,感谢任何看到这个的人。
解决方案
您可以检查错误并仅使用“好”行:
Dim v As Variant
'....
'....
'when you already know the start and end values, use For...Next
for rownum = 1 to LastRow
v = targetSheet.Cells(RowNum, ColumnNum).Value
If Not IsError(v) Then '<< skip any errors
If Len(v) > 0 Then '<< skip empty values
OutputString = OutputString & Replace(v, Chr(10), vbNewLine) & vbNewLine
End If
End If
Next RowNum
推荐阅读
- python - 在 Plotly 地图中为单条线 GeoJson/GeoPandas 线段着色
- javascript - Nuxtjs 错误无法在将标头发送到客户端后设置标头
- qt - QT 覆盖 .txt 文件
- docker - 基于参数运行 docker build
- r - 计算区域中的对象数
- javascript - 我有一个包含所有项目的 JSON,我想要一种将项目自动添加到嵌入页面的方法,但它会为每个项目发送新的嵌入
- reactjs - 错误:尝试预期。ts(1005)。在反应中使用firebase实现登录/注册时
- python - NUMPY (python) 和 ARMADILLO (c++) 给出不同的结果
- java - 使用 javax.persistence.EntityManager 将实体添加到我的 SQL 数据库时出错
- php - POST 类型的路由在 Laravel 的服务器上不起作用