#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
есть. У меня есть формула для этого на рабочем листе