这个问题可能已经有人问过了,但我还是要问一下,因为我对VBA和整个编程相当陌生,我不知道我做错了什么。我有一个用户表单,从一个文本框中获取数据(在这种情况下是一个数字),并在我的表格中搜索它。然后,从这个范围中,我正在做一些步骤来检索连接到这个数字的数据。
定义的变量。
Sub UserForm_Initialize()
Call CloseButtonSettings(Me, False)
Dim selected_col As Long
Dim PZ_ID As Single, KD_ID As Single, Customer_Combination As String, Ship_ID As String, Author_ID As String, _
Art_Lager As Single, Art_Bestell As Single, DTPicker1 As Date, Calc_Time As Single, Time1 As Single, _
Time2 As Single, Time3 As Single, Time_Special As Single, Time_Total As Single, Notes_Buero As String, Notes_Lager As Single
End Sub
搜索+将数据放入文本框中
Private Sub CommandButton1_Click()
Dim PZ_RNG As Range
Dim strSearch As String
strSearch = Packzettelinfo.PZ_ID
Set PZ_RNG = Range("B:B").Find(strSearch, , xlValues, xlWhole)
If Not PZ_RNG Is Nothing Then
Else
MsgBox "Packzettel Nr. " & strSearch & " konnte nicht gefunden werden (Fehler #001)", vbOKOnly
Packzettelinfo.PZ_ID.SetFocus
End If
Range("E1") = PZ_RNG.Row 'Saving for later
Packzettelinfo.KD_ID = Cells(PZ_RNG.Row, PZ_RNG.Column + 1)
Packzettelinfo.Customer_Combination = Cells(PZ_RNG.Row, PZ_RNG.Column + 2)
Packzettelinfo.Ship_ID = Cells(PZ_RNG.Row, PZ_RNG.Column + 3)
Packzettelinfo.Author_ID = Cells(PZ_RNG.Row, PZ_RNG.Column + 4)
Packzettelinfo.Art_Lager = Cells(PZ_RNG.Row, PZ_RNG.Column + 5)
Packzettelinfo.Art_Bestell = Cells(PZ_RNG.Row, PZ_RNG.Column + 6)
Packzettelinfo.DTPicker1 = Cells(PZ_RNG.Row, PZ_RNG.Column + 7)
Packzettelinfo.Calc_Time = Cells(PZ_RNG.Row, PZ_RNG.Column + 8)
Packzettelinfo.Time1 = Cells(PZ_RNG.Row, PZ_RNG.Column + 10)
Packzettelinfo.Time2 = Cells(PZ_RNG.Row, PZ_RNG.Column + 11)
Packzettelinfo.Time3 = Cells(PZ_RNG.Row, PZ_RNG.Column + 12)
Packzettelinfo.Time_Special = Cells(PZ_RNG.Row, PZ_RNG.Column + 13)
Packzettelinfo.Time_Total = Cells(PZ_RNG.Row, PZ_RNG.Column + 14)
Packzettelinfo.Notes_Buero = Cells(PZ_RNG.Row, PZ_RNG.Column + 15)
Packzettelinfo.Notes_Lager = Cells(PZ_RNG.Row, PZ_RNG.Column + 16)
End Sub
这很好用!但当我试图保存文本框时(当内容发生变化时),它说 "Runtime Error 424":"Runtime Error 424":"Runtime Error 424"。
但是,当我尝试保存文本框时(当内容被改变时),它说 "Runtime Error 424"。
Private Sub CB_PZ_save_edit_Click()
Cells(PZ_RNG.Row, PZ_RNG.Column + 1) = Packzettelinfo.KD_ID
Cells(PZ_RNG.Row, PZ_RNG.Column + 2) = Packzettelinfo.Customer_Combination
Cells(PZ_RNG.Row, PZ_RNG.Column + 3) = Packzettelinfo.Ship_ID
Cells(PZ_RNG.Row, PZ_RNG.Column + 4) = Packzettelinfo.Author_ID
Cells(PZ_RNG.Row, PZ_RNG.Column + 5) = Packzettelinfo.Art_Lager
Cells(PZ_RNG.Row, PZ_RNG.Column + 6) = Packzettelinfo.Art_Bestell
Cells(PZ_RNG.Row, PZ_RNG.Column + 7) = Packzettelinfo.DTPicker1
Cells(PZ_RNG.Row, PZ_RNG.Column + 8) = Packzettelinfo.Calc_Time
Cells(PZ_RNG.Row, PZ_RNG.Column + 10) = Packzettelinfo.Time1
Cells(PZ_RNG.Row, PZ_RNG.Column + 11) = Packzettelinfo.Time2
Cells(PZ_RNG.Row, PZ_RNG.Column + 12) = Packzettelinfo.Time3
Cells(PZ_RNG.Row, PZ_RNG.Column + 13) = Packzettelinfo.Time_Special
Cells(PZ_RNG.Row, PZ_RNG.Column + 14) = Packzettelinfo.Time_Total
Cells(PZ_RNG.Row, PZ_RNG.Column + 15) = Packzettelinfo.Notes_Buero
Cells(PZ_RNG.Row, PZ_RNG.Column + 16) = Packzettelinfo.Notes_Lager
End Sub
同样,因为我是新手,这可能是一个愚蠢的方法 对于我想做的事情,但哦,好... ...
让我们后退一步,看看我们要做什么。
现在我们可以把精力集中在这3个步骤上。
但在我们开始之前,你会受益于对以下内容的了解 范围 在VBA中。
现在你的代码不是最能说明问题的(至少不是英文),所以如果问题注释中没有说明,我就做一些假设。
下面的代码是写在一个新的用户表单上的,这个表单有一个文本框、标签和2个命令按钮,所有的按钮都有默认的名称(截图如下)。
你获取数据并将其放入文本框的方法很好。为了避免歧义,最好总是明确地限定我们的语句,这样代码就会在正确的workbookworksheet或userform等处查找。
Private Sub CommandButton1_Click()
Dim TargetCell As Range
Dim SearchString As String
SearchString = ThisWorkbook.Sheets("Sheet1").Range("A1").Value 'Only "Range("A1").Value" implies ActiveSheet which may give false results.
Set TargetCell = ThisWorkbook.Sheets("Sheet1").Range("B:B").Find(SearchString, , xlValues, xlWhole)
If Not TargetCell Is Nothing Then
'TargetRange Is Something, do the thing
'You could assign the values to the textbox here rather than outside of the If statement
'Or you could change it to If TargetCell Is Nothing Then - And only execute the code in the Else section below
Else
MsgBox "Packzettel Nr. " & strSearch & " konnte nicht gefunden werden (Fehler #001)", vbOKOnly
UserForm1.TextBox1.SetFocus
Exit Sub 'This stops the rest of the code from running - I'm assuming the above is an error that nothing was found.
End If
ThisWorkbook.Sheets("Sheet1").Range("E1") = TargetCell.Address 'Saving for later
UserForm1.TextBox1.Value = ThisWorkbook.Sheets("Sheet1").Cells(TargetCell.Row, TargetCell.Column).Offset(0, 1).Value
End Sub
我对代码做的唯一真正的修改是用明确的 哪儿 的 Range
或 Cells
或我们要访问的 Value
的属性。
这和使用 Offset
财产而不是 + 1
等为列。
用户根据需要修改数据--我们在编程上没有什么可做的。
你可以在这里增加一些数据验证的步骤等。
再把数据写回表,你写得相当好。同样我也会确保明确限定对象,比如说 Range
和 Cells
和相关的工作簿工作表,以及我们要访问的属性,如 Value
.
这次我将工作簿表分配给一个变量。
Private Sub CommandButton2_Click()
Dim TargetSheet As Worksheet
Set TargetSheet = ThisWorkbook.Sheets("Sheet1")
Dim TargetCellAddress As String
With TargetSheet
TargetCellAddress = .Range("E1").Value 'Recall our saved cell address from the Commandbutton1 click
.Range(TargetCellAddress).Offset(0, 1).Value = UserForm1.TextBox1.Value
.Range("E1").ClearContents 'Remove TargetCellAddress value from the sheet
End With
End Sub
基本上和上面的一样,但是反过来,虽然使用了保存的 Range.Address
昔日属性(在 E1
).
请注意,您可以将您的语句封装在一个叫 With Statement
如我 TargetSheet
这样你就可以访问它的对象、属性和方法,而不需要每次都对其进行限定--尽管每条语句都是以 .
总结一下。
Range
或 Cells
并明确引用你要使用的属性,即 Value
(有些人默认是这样,但不是所有的!)。下面是一些每次点击的截图。