Обойти несоответствие типов VBA для .Bat, созданного в Excel - PullRequest
2 голосов
/ 15 мая 2019

У меня есть таблица, в которую я ввожу данные. Имена файлов, а также время и масса информации, которая в итоге создает пакетный файл 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 строк заполняются # ЗНАЧЕНИЕ !. Таким образом, это выглядит так (ниже), когда в таблицу добавляется только 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. Я получаю сообщение об ошибке "Run-time error '13': несоответствие типов". Это несколько ожидаемо, потому что это электронная таблица объединяет все виды данных с датами, текстом и общими форматами. Что я хотел бы знать, так это ... как я могу изменить свой макрос так, чтобы он обрабатывал только нужные мне строки без ошибок. Я попытался сделать свои варианты переменных типов, чтобы увидеть, помогло ли это, конечно, это не так. Кроме того, как я могу обработать ошибки и просто пропустить строки, где обнаружено несоответствие типов? Я надеюсь, что это достаточно подробностей, спасибо всем, кто смотрит на это.

1 Ответ

2 голосов
/ 15 мая 2019

Вы можете проверить на ошибки и использовать только «хорошие» строки:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...