Невозможно передать строковый параметр в Sub при использовании флажка .OnAction - PullRequest
0 голосов
/ 08 апреля 2020

Как видно из заголовка, я не могу передать параметр 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. Спасибо за ваше терпение.

1 Ответ

0 голосов
/ 08 апреля 2020

Я разочаровался в вычислении одинарных и двойных кавычек VBA и признаю, что мне никогда не требовалось передавать что-либо в качестве аргумента, который не был доступен в книге, в которой находится флажок. Поэтому я могу легко получить всю информацию, которую могу передать непосредственно с рабочего листа.

Там, где этого может быть недостаточно, я также получаю доступ к самому объекту CheckBox. Все мои потребности в аргументах могут быть полностью удовлетворены без кавычек.

Private Sub CheckBox1_Click()

    Dim ChkBox As Shape

    Set ChkBox = ActiveSheet.Shapes(Application.Caller)
    MsgBox ChkBox.Parent.Name & vbcr & _
           ChkBox.OLEFormat.Object.Name
End Sub

Вот 3 возможных решения вашей проблемы, все из которых включают Application.Caller. Пожалуйста, запустите этот код в вашем проекте.

Sub CheckBox1_Click()

    Dim ChkBox As Shape
    Dim WsName As String, Rpos As Long, Cpos As Long
    Dim Cell As Range

    ' Solution 1
    WsName = ActiveSheet.Shapes(Application.Caller).OLEFormat.Object.Parent.Name
    MsgBox "You already know how to pass the cell coordinates" & vbCr & _
           "Just get the Sheet name from here:" & vbCr & _
           "Sheet name is """ & WsName & """"

    Set ChkBox = ActiveSheet.Shapes(Application.Caller)
    ' Solution 2
    Set Cell = ChkBox.OLEFormat.Object.TopLeftCell
    Rpos = Cell.Row
    Cpos = Cell.Column
    WsName = Cell.Worksheet.Name
    MsgBox "Solution 2" & vbCr & _
           "The checkbox Top Left is aligned with the" & vbCr & _
           "Linked Cell's Top Left:-" & vbCr & _
           "Row number = " & Rpos & vbCr & _
           "Column number = " & Cpos & vbCr & _
           "Worksheet name = " & WsName & vbCr & _
           "If Alignment of underlying cell and TopLeft" & vbCr & _
           "isn't perfect, modify the placement in your other code." & vbCr & _
           "Here is the TopLeft address:-" & vbCr & _
           "TopLeftCell address = " & Cell.Address


    ' Solution 3
    Set Cell = Range(ChkBox.OLEFormat.Object.LinkedCell)
    Rpos = Cell.Row
    Cpos = Cell.Column
    WsName = Cell.Worksheet.Name
    MsgBox "Solution 3" & vbCr & _
           "Get the information directly from the Linked Cell." & vbCr & _
           "(This is probably the one you are interested in):-" & vbCr & _
           "Row number = " & Rpos & vbCr & _
           "Column number = " & Cpos & vbCr & _
           "Worksheet name = " & WsName & vbCr & _
           "This method might fail if the linked cell" & vbCr & _
           "is altered, perhaps manually."
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...