Каждый день я работаю с отчетами, в которых перечислены результаты каждой инициативы, с которой мы работаем, в диапазоне примерно 40 возможных результатов. Я создал 4 группы, в которые может попасть каждый из этих результатов, чтобы уменьшить требуемое понимание, и хотел бы, чтобы мой код заменял каждый отдельный результат в столбце B назначенной ему группой результатов. Это мой первый раз, когда я создаю свою собственную функцию в VBA, поэтому, пожалуйста, простите любые очевидные ошибки.
Я создал простой Sub, который должен (надеюсь) найти последнюю строку столбца B, а затем зациклить каждую строку в столбце, передав содержащуюся строку в функцию, которую я создал. Следует принять строку, выполнить «выбор случая», чтобы выяснить, какой группе результатов будет назначена строка, а затем вернуть группу результатов в подпрограмму для текущей ячейки, в которую нужно отредактировать. Параметры выбора регистра в моем коде были уменьшены для удобства чтения. Кроме того, функция хранится в отдельном модуле VBA для подпрограммы.
Sub fixOutcomeColumn()
Dim lastRow As Long
Dim rng As Range, col As Range
Dim val As String
lastRow = Cells(Rows.Count, 2).End(xlUp).Row
val = "test"
Set col = ActiveWorkbook.ActiveSheet.Range("B1" & lastRow)
Set rng = ActiveWorkbook.ActiveSheet.Range("B1")
For Each rng In col.Cells
val = rng.Value
rng = changeOutcomesToOG(val)
Next rng
End Sub
Public Function changeOutcomesToOG(str As String) As String
Select Case str
Case "a"
changeOutcomesToOG = "A"
Case "b"
changeOutcomesToOG = "B"
Case "c"
changeOutcomesToOG = "C"
Case "d"
changeOutcomesToOG = "D"
Case "e"
changeOutcomesToOG = "E"
Case Else
changeOutcomesToOG = str
End Select
End Function
Пошаговое выполнение кода в редакторе при чтении окна Locals показывает, что моя переменная rng не заполняется никакими значениями при запуске кода. Кроме того, код не перебирает каждую ячейку в столбце, а вместо этого запускает цикл for один раз. Я предполагаю, что я сделал довольно основную ошибку, но не могу понять это для моей жизни!
Можете ли вы попробовать это:
Sub fixOutcomeColumn()
Dim lastRow As Long
Dim rng As Range, col As Range
Dim val As String
lastRow = Cells(Rows.Count, 2).End(xlUp).Row
val = "test"
Set col = ActiveWorkbook.ActiveSheet.Range("B1:B" & lastRow)
'Set rng = ActiveWorkbook.ActiveSheet.Range("B1")
For Each rng In col.Cells
val = rng.Value
rng.Value = changeOutcomesToOG(val)
Next rng
End Sub
Public Function changeOutcomesToOG(str As String) As String
Select Case str
Case "a"
changeOutcomesToOG = "A"
Case "b"
changeOutcomesToOG = "B"
Case "c"
changeOutcomesToOG = "C"
Case "d"
changeOutcomesToOG = "D"
Case "e"
changeOutcomesToOG = "E"
Case Else
changeOutcomesToOG = str
End Select
End Function
Не могу поверить, что одна строчка испортила весь код! Большое спасибо, это исправлено.
Ну, это ответ сейчас
Попробуйте найти строку, в которой вы получаете сообщение об ошибке, используя F8.