Найдена информация о строке хранилища пользовательской формы для обновления листа - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть пользовательская форма, в которой я хочу найти информацию для заполнения текстовых полей, если два критерия найдены в одной строке. Код работает найти с CommandButton1, но я хочу иметь возможность обновлять текстовые поля информации, найденной с CommandButton2, поэтому мне нужно, чтобы строка сохранялась и могла изменять информацию этой строки с помощью CommandButton2_Click (). Я также хотел бы, чтобы способ немного перекодировать CommandButton1_Click (), чтобы иметь возможность сопоставлять только часть txtsearch и txtname вместо просмотра всего значения.

Кроме того, я получаю сообщение об ошибке с CommandButton2_Click (), что у меня возникает ошибка времени выполнения «1004»: ошибка приложения или объекта для Cells(currentrow, 5).Value = aa. Это та часть, где я хочу, чтобы информация на исходной странице обновлялась измененной информацией, введенной пользователем. Любая помощь приветствуется.

Я уже сделал несколько правок, но может кто-нибудь подсказать, как мне изменить код, чтобы он работал? Или обратиться к поиску части значения вместо всего значения?

Option Explicit
Public 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 & currentrow
            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

Public 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
Cells(currentrow, 5).Value = aa
bb = txt2.Value
Cells(currentrow, 3).Value = bb
cc = txt3.Value
Cells(currentrow, 6).Value = cc
dd = txt4.Value
Cells(currentrow, 7).Value = dd
ee = txt5.Value
Cells(currentrow, 8).Value = ee
ff = txt6.Value
Cells(currentrow, 9).Value = ff
gg = txt7.Value
Cells(currentrow, 10).Value = gg
hh = txt8.Value
Cells(currentrow, 11).Value = hh
ii = txt9.Value
Cells(currentrow, 12).Value = ii
jj = txt10.Value
Cells(currentrow, 13).Value = jj
kk = txt11.Value
Cells(currentrow, 14).Value = kk
End Sub

1 Ответ

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

Вот быстрый неработающий пример, который поможет вам понять, как кодировать вашу проблему. Глобальные переменные не всегда являются решением, особенно в Public модулях. Но вы работаете в пользовательской форме Class.

Вы можете установить набор закрытой переменной, доступной для всех ваших методов в вашем классе пользовательской формы. Я использовал метод , который обсуждался на Rubberduck , чтобы создать внутреннюю переменную с именем this. Это помогло мне организовать свои переменные в классе. Обратите внимание, что я инициализирую переменную Worksheet при создании пользовательской формы.

Внутри ваших методов нажатия кнопки вы фиксируете данные (например, номер строки) и используете их по мере необходимости.

Но, пожалуйста, всегда используйте Option Explicit и создайте имена для ваших переменных, которые имеют смысл:)

Option Explicit

Private Type InternalData
    matchedRow As Long
    theGoodsWS As Worksheet
End Type
Private this As InternalData

Private Sub CommandButton1_Click()
    Dim lastRow As Long
    Dim searchRange As Range
    Dim cel As Range

    With this.theGoodsWS
        lastRow = .Cells(.Rows.Count, 2).End(xlUp).Row
        Set searchRange = .Cells(2, 2).Resize(lastRow)
        this.matchedRow = -1
        For Each cel In searchRange.Cells
            If (cel.Value = Me.txtname.Value) And _
               (cel.Offset(0, 2).Value = Me.textsearch.Value) Then
                this.matchedRow = cel.Row
                '--- assign your textbox values here
            End If
        Next cel
    End With
End Sub

Private Sub CommandButton2_Click()
    If this.matchedRow <> -1 Then
        With this.theGoodsWS
            .Cells(this.matchedRow, 5).Value = Me.txt1.Value
            '...
        End With
    End If
End Sub

Private Sub UserForm_Initialize()
    Set this.theGoodsWS = ThisWorkbook.Sheets("The Goods")
    this.matchedRow = -1
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...