Как видно из заголовка, я не могу передать параметр String через OnAction, который возникает, когда установлен флажок. Я успешно передал два целочисленных значения в сабвуфер, когда флажок установлен, но теперь мне нужно также передать параметр String (String на самом деле является именем текущего рабочего листа).
В настоящее время это то, что он выглядит так:
'Start of for loop which will run from the lower bound of esq to the upper bound.
For i = LBound(esq) To UBound(esq)
'Inserts a row at the specified location, the current row + 1 + the value of i (0 to 12 depending on which run of the loop it is currently on).
workSource.Rows(rowPos + 1 + i).Insert
'Sets cb as equal to the specified cell in the newly inserted row.
Set cb = workSource.CheckBoxes.Add(Cells(rowPos + 1 + i, colPos + 1).Left, Cells(rowPos + 1 + i, colPos + 1).Top, _
Cells(rowPos + 1 + i, colPos + 1).Width, Cells(rowPos + 1 + i, colPos + 1).Height)
'Start of With which sets the attributes of cb.
With cb
'Sets the caption as the current element of esq.
.Caption = esq(i)
'Links the checkbox with the cell directly beneath it.
.LinkedCell = Cells(rowPos + 1 + i, colPos + 1).Address
'Adds a macro which will be activated when it is clicked. The cell's row and column position will be passed as parameters to the macro.
.OnAction = "'ProcessCheckBox " & rowPos + 1 & "," & colPos + 1 + i & "," & currentName & "'"
'.OnAction = "'" & ThisWorkSheet.Name & "'!ProcessCheckBox"
'.OnAction = "'ProcessCheckBox " & rowPos + 1 & "," & colPos + 1 + i & "," & """SES""" & "'"
'.OnAction = "'ProcessCheckBox " & currentName & "'"
'End of With.
End With
'Starts next run of loop and increments i.
Next i
Есть три закомментированных строки OnAction, с которыми я попытался поэкспериментировать, чтобы получить только строку для передачи. К сожалению, никто из них не работал. Вот начало кода для подпрограммы ProcessCheckBox:
'Sub to process when a checkbox has been changed.
Sub ProcessCheckBox(ByVal rowPos As Integer, ByVal colPos As Integer, ByVal currentSheet As String)
'Sub ProcessCheckBox(ByVal currentSheet As String)
MsgBox currentSheet
'Declares a worksheet object named currentSheet.
Dim activeSheet As Worksheet
'Sets currentSheet equal to the active worksheet.
Set activeSheet = ThisWorkbook.Worksheets(currentSheet)
'Set currentSheet = ActiveSheet
После установки флажка появляется сообщение msgbox, которое совершенно пустое, и затем я сталкиваюсь с ошибкой, в которой говорится, что индекс находится вне диапазона .
Я понял из этого, что вызывается sub, значение String просто не передается. Строковое значение в первом подпрограмме (currentName) действительно имеет значение, так как я могу распечатать его и использовать для расчетов просто отлично.
Я думаю, что проблема в самой строке OnAction. Мне потребовалось некоторое время, чтобы понять, как передать целочисленные значения из-за незнания правильного количества одинарных и двойных кавычек для использования. Я думаю, что это связано с этим, однако, все другие примеры, которые я видел, передавали значения String, как это. Я даже экспериментировал, добавляя или удаляя кавычки, просто чтобы увидеть, сработает ли это и ничего.
Другие ошибки, которые я думал, могут быть; подпрограмма имеет ограничение на то, сколько / больших параметров может быть передано ему, только параметры одного типа могут быть переданы (String или Integer). Ни один из них не имеет смысла, потому что я встречал много примеров, которые передают гораздо больше данных по различным типам в подпрограмму.
Пожалуйста, помогите мне, если можете. Я был бы очень признателен.
Редактировать: Спасибо людям, которые ответили, но ни одно из предложенных решений не сработало. Я тестировал макрос, и кажется, что независимо от того, что я делаю, он не будет передавать строку в качестве параметра, отдельно или с другими параметрами. Я не знаю почему.
Вот две рассматриваемые строки, которые я сузил до:
.OnAction = "'ProcessCheckBox " & colPos + 1 & "," & rowPos + 1 + i & ",""" & nameSheet & """'"
И первая строка подпрограммы:
Sub ProcessCheckBox(ByVal colPos As Integer, ByVal rowPos As Integer, ByVal sheetName As String)
Если поставить галочку, появляется сообщение об ошибке «Аргумент не является обязательным». Однако он не позволяет мне go перейти в режим отладки и не выделяет указанную строку c, хотя я проверил ее и считаю, что эти две строки являются проблемой.
Снова, любая помощь будет оценена.
Редактировать 2: Решение найдено. Мне нужно было снять флажки и перестроить их, чтобы изменения в коде вступили в силу. Человеческая ошибка была причиной в конце концов. Большое спасибо за ответы, они оба работали в конце концов, просто пришлось восстановить ckeckboxes. Спасибо за ваше терпение.