Перебор диапазона, копирование определенных ячеек, вставка с форматированием на другой лист

#excel #vba

#excel #vba

Вопрос:

Я работаю над методом, который скопирует определенные ячейки в диапазоне на другой лист. Это работало нормально, но я решил добавить к нему еще немного функциональности, и теперь я не могу понять, что здесь не так.

Отладчик указывает на NameVar = .Range(.Cells(FirstWord.row 1, FirstWord.Column), .Cells(SecondWord.row - 2, FirstWord.Column 9)).Value2 сообщение «Несоответствие типов».

Я пытаюсь сохранить значение ячейки в переменной NameVar . Затем я пытаюсь добавить версию «pieces» = «pcs» в соответствии с выбранным для нее языком. Чтобы это было NameVar pcs в другой переменной NameVarResult . Затем в конце просто передайте переменный результат в другую ячейку на другом листе.

Вот мой текущий код:

 Private Sub copyToTable(SectionName As Variant, SearchWordOne As String, SearchWordTwo As String, RowToPaste As Integer, OperatingWorksheet As Worksheet)

    'On Error Resume Next

    Dim FirstWord, SecondWord
    Dim NameVar As String, NameVarResult As String
    Dim AmountVar As String, AmountVarResult As String
    Dim PriceVar As String, PriceVarResult As String
            
    Set FirstWord = OperatingWorksheet.Range("C:C").Find(SectionName amp; " - " amp; SearchWordOne, LookIn:=xlValues, lookat:=xlWhole)
    Set SecondWord = OperatingWorksheet.Range("C:C").Find(SectionName amp; " - " amp; SearchWordTwo, LookIn:=xlValues, lookat:=xlWhole)
    
    With OperatingWorksheet
        If Not FirstWord Is Nothing Then
            ' Copy - Paste name
            NameVar = .Range(.Cells(FirstWord.row   1, FirstWord.Column), .Cells(SecondWord.row - 2, FirstWord.Column   9)).Value2
            
            If ThisWorkbook.Worksheets("OtherData").Range("K80").Value = "English" Then
                NameVarResult = NameVar amp; " " amp; "pc(s)"
                ThisWorkbook.Worksheets("TableForOL").Range("B" amp; RowToPaste).Value = NameVarResult
            ElseIf ThisWorkbook.Worksheets("OtherData").Range("K80").Value = "German" Then
                NameVarResult = NameVar amp; " " amp; "Stck"
                ThisWorkbook.Worksheets("TableForOL").Range("B" amp; RowToPaste).Value = NameVarResult
            Else
                NameVarResult = NameVar amp; " " amp; "st"
                ThisWorkbook.Worksheets("TableForOL").Range("B" amp; RowToPaste).Value = NameVarResult
            End If
        
            ' Copy - Paste amount
            AmountVar = .Range(.Cells(FirstWord.row   1, FirstWord.Column   10), .Cells(SecondWord.row - 2, FirstWord.Column   10)).Value
            
            If ThisWorkbook.Worksheets("OtherData").Range("K80").Value = "English" Then
                AmountVarResult = AmountVar amp; " " amp; "pc(s)"
                ThisWorkbook.Worksheets("TableForOL").Range("C" amp; RowToPaste).Value = AmountVarResult
            ElseIf ThisWorkbook.Worksheets("OtherData").Range("K80").Value = "German" Then
                AmountVarResult = AmountVar amp; " " amp; "Stck"
                ThisWorkbook.Worksheets("TableForOL").Range("C" amp; RowToPaste).Value = AmountVarResult
            Else
                AmountVarResult = AmountVar amp; " " amp; "st"
                ThisWorkbook.Worksheets("TableForOL").Range("C" amp; RowToPaste).Value = AmountVarResult
            End If
    
            ' Copy - Paste price
            PriceVar = .Range(.Cells(FirstWord.row   1, FirstWord.Column   17), .Cells(SecondWord.row - 2, FirstWord.Column   17)).Value
            
            If ThisWorkbook.Worksheets("OtherData").Range("K80").Value = "English" Then
                PriceVarResult = PriceVar amp; " " amp; "pc(s)"
                ThisWorkbook.Worksheets("TableForOL").Range("E" amp; RowToPaste).Value = PriceVarResult
            ElseIf ThisWorkbook.Worksheets("OtherData").Range("K80").Value = "German" Then
                PriceVarResult = PriceVar amp; " " amp; "Stck"
                ThisWorkbook.Worksheets("TableForOL").Range("E" amp; RowToPaste).Value = PriceVarResult
            Else
                PriceVarResult = PriceVar amp; " " amp; "st"
                ThisWorkbook.Worksheets("TableForOL").Range("E" amp; RowToPaste).Value = PriceVarResult
            End If
        End If
    End With
    
End Sub
  

Комментарии:

1. Что вы пытаетесь сделать с этой строкой — объединить? Вы не можете присвоить содержимое нескольких ячеек строке за один раз подобным образом.

2. NameVar является String переменной, ваша ошибка возникает из-за того, что .Range(.Cells(FirstWord.row 1, FirstWord.Column), .Cells(SecondWord.row - 2, FirstWord.Column 9)).Value2 возвращает 2D массив, который может храниться только в Variant переменной типа.

3. Если вы хотите выполнить объединение, вы также можете использовать TEXTJOIN функцию worksheet, если вы используете вспомогательную версию Excel. Вы можете сделать это в коде WorksheetFunction.TextJoin или в ячейке Excel, а затем прочитать эту ячейку в NameVar .

4. @SuperSymmetry хорошая идея, хотя вы могли бы сделать то же самое, какая бы версия у вас ни была, но с Join() функцией для массивов, которая заняла бы 2 шага вместо одного, но работает в каждой версии 🙂

5. @SuperSymmetry я проверяю только для FirstWord потому что, если это не удается, нет необходимости продолжать дальше. SecondWord всегда есть, если FirstWord есть. У меня есть формула для этого на рабочем листе