Передать переменную между подпрограммами - PullRequest
0 голосов
/ 07 ноября 2019

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

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

Option Explicit
Private currentrow As Long

Sub MainMacro()
currentrow = cel.Row
CommandButton2 (currentrow)
End Sub

Private Sub CommandButton1_Click()
Dim ws As Worksheet, cel As Range
    Set ws = Sheets("The Goods")
    For Each cel In ws.Cells(2, 2).Resize(ws.Cells(Rows.Count, 2).End(xlUp).Row).Cells
        If cel.Value = Me.txtname.Value And cel.Offset(, 2).Value = Me.txtsearch.Value Then
            currentrow = cel.Row
            Me.txt1.Value = cel.Offset(, 3).Value
            Me.txt2.Value = cel.Offset(, 1).Value
            Me.txt3.Value = cel.Offset(, 4).Value
            Me.txt4.Value = cel.Offset(, 5).Value
            Me.txt5.Value = cel.Offset(, 6).Value
            Me.txt6.Value = cel.Offset(, 7).Value
            Me.txt7.Value = cel.Offset(, 8).Value
            Me.txt8.Value = cel.Offset(, 9).Value
            Me.txt9.Value = cel.Offset(, 10).Value
            Me.txt10.Value = cel.Offset(, 11).Value
            Me.txt11.Value = cel.Offset(, 12).Value
        End If
    Next cel

End Sub

Function find_irow()
    currentrow = cel.Row
    Call CommandButton2
End Function

Private Sub CommandButton2_Click()
Dim aa As String, bb As String, cc As String, dd As String, ee As String, ff As String, gg As String, hh As String, ii As String, jj As String, kk As String


    aa = txt1.Value
    bb = txt2.Value
    cc = txt3.Value
    dd = txt4.Value
    ee = txt5.Value
    ff = txt6.Value
    gg = txt7.Value
    hh = txt8.Value
    ii = txt9.Value
    jj = txt10.Value
    kk = txt11.Value

With Sheets("The Goods")
        Cells(currentrow, 5).Value = aa
        Cells(currentrow, 3).Value = bb
        Cells(currentrow, 6).Value = cc
        Cells(currentrow, 7).Value = dd
        Cells(currentrow, 8).Value = ee
        Cells(currentrow, 9).Value = ff
        Cells(currentrow, 10).Value = gg
        Cells(currentrow, 11).Value = hh
        Cells(currentrow, 12).Value = ii
        Cells(currentrow, 13).Value = jj
        Cells(currentrow, 14).Value = kk
End With

End Sub

1 Ответ

0 голосов
/ 07 ноября 2019

Как только ваш саб MainMacro будет запущен, ваша система очистит память для переменной currentRow. При этом значение переменных пропало, и вы больше не можете использовать его в другом подпрограмме. Возможное решение - сохранить значение переменной currentRow в ячейке и снова вызвать его во втором подпрограмме, например:

Sub MainMacro()
Dim currentrow As Integer
currentrow = cel.Row
CommandButton2 (currentrow)
Cells(100,100).value = currentrow
End Sub

Private Sub CommandButton1_Click()

currentrow = cells(100,100).value

[...]

End Sub

etc.

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

PS: попробуйте использовать верблюд C ase в ваших кодах. Это облегчит вам чтение кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...