VBA не работает, если есть пустая ячейка - PullRequest
0 голосов
/ 08 ноября 2019

Я работал над сценарием, который сначала импортирует CSV, а затем добавляет значения в ячейки в зависимости от значения в столбце «материал».

Я могу заставить сценарий работать, но только если всеячейки имеют значения.

Это не всегда возможно, поскольку в некоторых импортируемых данных эти значения отсутствуют.

Я попытался добавить в код строку, которая добавила бы значение «0» в ячейку, если она была пустой. Я надеялся, что эта строка будет выполнена последовательно, но это не так. Я получаю сообщение об ошибке 1004 во время выполнения. Я знаю, что это работает, если в ячейке есть числовое значение.

Sub CostCal()

'Call load_csv

    Dim Firstrow As Long
    Dim lastrow As Long
    Dim lRow As Long
    Dim CalcMode As Long
    Dim ViewMode As Long
    Dim i As Long
    Dim ws2 As Worksheet

    Application.Volatile


    'Optimize Code
      Call OptimizeCode_Begin

    'We use the ActiveSheet but you can replace this with
    'Sheets("MySheet")if you want
    With ActiveSheet

        'We select the sheet so we can change the window view
        .Select

        'If you are in Page Break Preview Or Page Layout view go
        'back to normal view, we do this for speed
        'ViewMode = ActiveWindow.View
       'ActiveWindow.View = xlNormalView

        'Turn off Page Breaks, we do this for speed
        '.DisplayPageBreaks = False

        Firstrow = .UsedRange.Cells(1).Row
        lastrow = .UsedRange.Rows(.UsedRange.Rows.Count).Row

        For lRow = lastrow To Firstrow Step -1

            Set ws2 = ThisWorkbook.Sheets("MASTER")


            With .Cells(lRow, "G")

                If Not IsError(.Value) Then

                       If Cells(lRow, "D").Value = "" Then Cells(lRow, "D").Value = ("0")

                       'If .Value Like ("*MS*") Then Cells(lRow, "D").Value = Cells(lRow, "E").Value * ws2.Range("H5").Value
                       If .Value Like ("*MS*") Then Cells(lRow, "D").Value = ("=" & Cells(lRow, "E") & "*MASTER!$H$5")

                       If .Value Like ("*ANGLE*") Then Cells(lRow, "D").Value = Cells(lRow, "E").Value * ws2.Range("H6").Value

                       If .Value Like ("*BOX SECTION*") Then Cells(lRow, "D").Value = Cells(lRow, "E").Value * ws2.Range("H6").Value

                       If .Value Like ("*CHANNEL*") Then Cells(lRow, "D").Value = Cells(lRow, "E").Value * ws2.Range("H6").Value

                       If .Value Like ("*I-BEAM*") Then Cells(lRow, "D").Value = Cells(lRow, "E").Value * ws2.Range("H6").Value

                       If .Value Like ("*PIPE*") Then Cells(lRow, "D").Value = Cells(lRow, "E").Value * ws2.Range("H6").Value

                       If .Value Like ("*ROUND-BAR*") Then Cells(lRow, "D").Value = Cells(lRow, "E").Value * ws2.Range("H6").Value

                       If .Value Like ("*SQUARE-BAR*") Then Cells(lRow, "D").Value = Cells(lRow, "E").Value * ws2.Range("H6").Value

                       If .Value Like ("*STAINLESS-STEEL*") Then Cells(lRow, "D").Value = Cells(lRow, "E").Value * ws2.Range("H7").Value

                       If .Value Like ("*THREADED-BAR*") Then Cells(lRow, "D").Value = Cells(lRow, "D").Value * ws2.Range("H8").Value

                       'If .Value Like ("*PURCHASED*") Then Cells(lRow, "D").Value = Cells(lRow, "D").Value * ws2.Range("H8").Value
                       If .Value Like ("*PURCHASED*") Then Cells(lRow, "D").Value = "=(RC[-6]) * (ws2.range(R8, C8)"

                       If .Value Like ("*POLYCARBONATE*") Then Cells(lRow, "D").Value = Cells(lRow, "D").Value * ws2.Range("H8").Value

                       If .Value Like ("*POLYURETHANE*") Then Cells(lRow, "D").Value = Cells(lRow, "D").Value * ws2.Range("H8").Value

                       If .Value Like ("*PVC*") Then Cells(lRow, "D").Value = Cells(lRow, "D").Value * ws2.Range("H8").Value

                       If .Value Like ("*RUBBER*") Then Cells(lRow, "D").Value = Cells(lRow, "D").Value * ws2.Range("H8").Value

                       If .Value Like ("*DURBAR*") Then Cells(lRow, "D").Value = Cells(lRow, "E").Value * ws2.Range("H5").Value

                       If .Value Like ("*1_INCH_MESH*") Then Cells(lRow, "D").Value = Cells(lRow, "D").Value * ws2.Range("H8").Value

                      'If .Cells.Offset(0, -6).Value Like ("*Part*") Then Cells(lRow, "J").Formula = ("=" & Cells(lRow, "D") & "*" & Cells(lRow, "C"))

                       If .Cells.Offset(0, -6).Value Like ("*Part*") Then Cells(lRow, "J").Value = "=(RC[-6]*RC[-7])"


                End If

            End With

        Next lRow

    End With

'Optimize Code
  Call OptimizeCode_End

End Sub

Подпрограмма должна искать значение в столбце D, если значение ячейки совпадает со значением кода, то оно будет умножено на значениев конкретной ячейке в мастер-листе. У меня есть два варианта ниже, первый будет использовать только значения, а второй будет использовать местоположение ячейки, второй позволяет мне легко обновлять собственные затраты для конкретного материала.

Окончательный оператор If предоставититоговое значение в столбце J, для которого указано количество x удельная стоимость

Мне все еще необходимо указать итоговую сумму в нижней части этого столбца, но я хочу, чтобы первая часть кода работала.

Я уверен, что есть гораздо более умные и простые методы для того, что мне нужно делать. но у меня пока нет знаний ...

Большое спасибо за любую помощь.

1 Ответ

1 голос
/ 08 ноября 2019

Я заменил строку:

If Cells(lRow, "D").Value = "" Then Cells(lRow, "D").Value = ("0")

На:

If Trim(.Cells.Offset(0, -3)) = "" Then Cells(lRow, "D").Value = ("0")

Оказалось, что ячейка заполнена пробелами, поэтому сначала ее нужно обрезать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...