首页 > 解决方案 > 解决 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':类型不匹配”错误。这在某种程度上是意料之中的,因为它是电子表格将各种内容与日期、文本和一般格式连接起来。我想知道的是......我怎样才能更改我的宏,以便它只处理我需要的行而不会出错。我试过让我的变量变体类型,看看是否有帮助,当然没有。此外,我该如何处理错误并跳过检测到类型不匹配的行?我希望这是足够的细节,感谢任何看到这个的人。

标签: excelvbabatch-fileexcel-formula

解决方案


您可以检查错误并仅使用“好”行:

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

推荐阅读