#excel #vba
#excel #vba
Вопрос:
Итак, я создаю фрагмент кода, который перемещает строку данных на другой лист со значением в столбце окна, которое я превращаю в «7 — Задействовано»
Все, вплоть до того, что выделенный код (показанный выше) работает хорошо.
Я подумал, что если бы я превратил строку данных в массив, было бы проще затем опубликовать это на следующем листе.
Код, который я использую ниже, теперь выдает ошибку времени выполнения 438: Ожидаемая ошибка компиляции: я выделил дентификатор или заключил в квадратные скобки.
Дело в том, что я не могу определить, в какой строке данных это будет, поскольку это будет зависеть от того, в какой строке было внесено изменение в I столбец.
Кроме того, я хочу, чтобы данные были размещены в первой пустой строке на следующем листе -‘Tank’
Я пробовал перемещать каждую ячейку по отдельности, используя Offset и PasteSpecial , но это и в лучшие времена было неуклюжим и само по себе вызывало проблемы.
Должен ли я продолжать использовать транспонированный массив и как мне вставить переменные массива на другой лист
Dim myRange As Range
For Each myRange In Range("I6:I1000")
Select Case myRange.Value
Case "7 - engaged"
VBA.Interaction.MsgBox "Client status selected as engaged. Confirm to post to tank", 1, "Status Change"
myArr = Application.Transpose(Application.Transpose(Range("A:M")))
Sheets("Tank").(BlankRow = Range("B1000").End(xlUp).Row 1)
ActiveSheet.Range("A:M") = WorksheetFunction.Transpose(arr)
End Select
Next myRange
End Sub
Комментарии:
1. Добро пожаловать в Stack Overflow. Я предполагаю, что ваш вопрос был отклонен, потому что вы опубликовали скриншот кода, а не фактический код. Это исключительно затрудняет людям помощь и устранение неполадок в вашей проблеме. Пожалуйста, замените изображение фактическим кодом, и людям будет намного проще помогать.
Ответ №1:
Я думаю, вам нужно что-то вроде приведенного ниже кода.
Option Explicit
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Source As Range)
' Maybe disable events whilst this code runs (and re-enable before exit)
' to prevent recursion.
If Source.Column <> 9 Then Exit Sub ' 9 = I
If Source.Cells.Count > 1 Then Exit Sub ' Check this first before making comparison on next line
If Source.Value <> "7 - engaged" Then Exit Sub
If MsgBox("Client status selected as engaged. Confirm to post to tank.", vbOKCancel) = vbOK Then
With ThisWorkbook.Worksheets("Tank")
Dim rowToPasteTo As Long
rowToPasteTo = .Cells(.Rows.Count, "B").End(xlUp).Row 1
.Range("A" amp; rowToPasteTo amp; ":" amp; "M" amp; rowToPasteTo).Value = Sh.Range("A" amp; Source.Row amp; ":" amp; "M" amp; Source.Row).Value
End With
End If
End Sub
Полезно помещать Option Explicit
перед вашим кодом. Похоже, что вы назначили, myArr
но перенесли arr
в свой код. Предполагая, что это не были глобальные переменные, Option Explicit
могут возникнуть такие проблемы. Также были некоторые ошибки синтаксиса и элемента / атрибута.
Комментарии:
1. Приношу извинения за то, что вчера не добавил код, я устал и не подумал