excel - Excel VBA用户表单文本框具有使用不同文本框的动态脚本
问题描述
我是 Excel VBA Userform 的新手。我想解决以下 2 个问题:
1)我有三个文本框名称客户姓名、手机号码和电子邮件 ID --> 我从 Sheet1 获取这些数据,这就像一个数据库,其中存储了所有这三列数据,并且会不时更改。接下来,我将组合框依赖于另一个文本框-> 这两个充当父项和子项,组合框是父项,文本框是子项,在组合框中选择的任何项目脚本将显示在文本框中。
考试:如果我选择“汽车”项,那么它的脚本将在子文本框中显示为“名称有新车,他的手机号码是:& 电子邮件 ID 是:”,就像我有多达 200 个这样的脚本一样。
我想将显示在此用户窗体上的前三个文本框数据直接填充到此脚本中,如下例所示
如果客户名称是 John,手机号码 132132132 和电子邮件 id test@test.com 当用户从父组合框中选择汽车时,此文本框将填充数据,例如“John 有新车,他的手机号码是:132132132 & email id 是:test@ test.com”,这样我就可以在 Sheet2 中保存数据
在这 200 个脚本中,客户详细信息将改变他们在脚本中的位置。意味着少数脚本中的客户名称将出现在脚本的末尾。
2)我还有两个相同形式的文本框,其中一个文本框用于输入客户语言,另一个文本框用于输入日期和时间(当前或特定日期和时间)。一旦我输入客户语言说英语和当前日期和时间,然后我选择更新按钮这两个文本框值需要保存在我上面解释的几个脚本上。
示例:
“John 有新车,他的手机号码是:132132132,电子邮件 ID 是:test@test.com,语言是英语,访问时间当前日期和时间”“我在日期和时间见到 Kiran,然后他问我的联系电话和电子邮件 ID。语言是德国”
在以上两个示例中,我必须在某些脚本中使用所有文本框值,我只需要使用客户名称。
我正在使用搜索按钮调用这些客户数据,该按钮将从 sheet1 中提取数据。一切都像在表格上提取和保存数据一样工作,但我无法找到与上述两种情况相匹配的选项。
请如果你能分享这个的确切代码会有所帮助,因为我尝试直接在带有修剪选项的工作表上进行连接,这完全出错了,所以我得到了关于如何处理的结构。
提前谢谢了
编辑:当然,请在下面找到详细信息,感谢您的更新
下面是用户表单的视图。 因此,我用于 sheet1 的客户详细信息框架是存储我的数据库,当我们单击搜索按钮时将显示在表单上搜索按钮代码是
`Private Sub CommandButton3_Click()
Dim Cust_Name As String
Cust_Name = Trim(TextBox1.Text)
LastRow = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To LastRow
If Worksheets("Sheet1").Cells(i, 1).Value = Cust_Name Then
TextBox1.Text = Worksheets("Sheet1").Cells(i, 2).Value
TextBox2.Text = Worksheets("Sheet1").Cells(i, 3).Value
TextBox3.Text = Worksheets("Sheet1").Cells(i, 4).Value
End If
Next
End Sub`
对于额外的详细信息框架,我有以下两个文本框的代码,我们需要在其中手动输入语言,将输入英语或任何其他语言以及日期和时间
因此,对于显示时间,我使用了代码
Me.TextBox10.Value = Format(Now, "dd/mm/yyyy hh:mm:ss")
对于使用以下代码的依赖组合框和脚本文本框的脚本 Windows 框架
`Private Sub ComboBox1_Change()
Dim i As Long, LastRow As Long
LastRow = Sheets("Sheet2").Range("F" & Rows.Count).End(xlUp).Row
For i = 2 To LastRow
If Sheets("Sheet2").Cells(i, "F").Value = (Me.ComboBox1) Then
Me.TextBox5 = Sheets("Sheet2").Cells(i, "G").Value
End If
Next
End Sub`
`Private Sub ComboBox1_DropButtonClick()
Dim i As Long, LastRow As Long
LastRow = Sheets("Sheet2").Range("F" & Rows.Count).End(xlUp).Row
If Me.ComboBox1.ListCount = 0 Then
For i = 2 To LastRow
Me.ComboBox1.AddItem Sheets("Sheet2").Cells(i, "F").Value
Next i
End If
End Sub`
因此,从“客户详细信息”框架中,当我从下拉列表中选择脚本时,我希望所有详细信息都应该适合脚本自动执行,并且一旦我手动输入详细信息并单击更新按钮,这些详细信息也需要从“额外详细信息”框架中在该脚本文本框中更新。
根据我分享的图像和下面的详细信息,我需要在最终输出中获得。约翰有新车,他的手机号码是:123456789 & 电子邮箱是:test@test.com,语言是英语,当前访问时间 14-04-2020 12:46:33
这是我在最终修改后的脚本中需要的,我可以使用以下代码将其保存在工作表中。
`Private Sub CommandButton1_Click()
Dim sh As Worksheet
Set sh = ThisWorkbook.Sheets("Sheet4")
Dim n As Long
n = sh.Range("A" & Application.Rows.Count).End(xlUp).Row
sh.Unprotect "test"
sh.Range("A" & n + 1).Value = Me.TextBox1.Value
sh.Range("B" & n + 1).Value = Me.TextBox2.Value
sh.Range("C" & n + 1).Value = Me.TextBox3.Value
sh.Range("E" & n + 1).Value = Me.TextBox5.Value
sh.Protect "test"
End Sub`
还有什么需要的告诉我谢谢。
解决方案
下面的代码显示了如何解决问题。请研究一下。
Option Explicit
Private Sub Demo_Of_Method()
Const MyScript = "|having new||. " & vbCr & _
"His mobile number is||. " & vbCr & _
"Email is||. " & vbCr & _
"Language spoken was||. " & vbCr & _
"Time of conversation:||"
Dim Script() As String
Dim CustDetail As Variant
Dim i As Integer, n As Integer
CustDetail = Array("John", "car", "123123123", "John@test.com", "German", Now())
Script = Split(MyScript, "|")
For i = 0 To UBound(CustDetail)
Script(n) = CustDetail(i)
n = n + 2 ' every other element of 'Script' is blank.
Next i
MsgBox Join(Script) ' the default separator is a single space
End Sub
该Script
数组被构造为具有交替的填充和空白元素。在您的项目中,它可能已在您的数据库中准备好并从那里引入。它通过拆分“|”来处理,“|”是文本中不出现的字符。因此,其中两个 || 紧随其后的是一个空白元素,前导“|”也是如此。
CustDetail
在您的项目中,您将从文本框值构造数组。然后使用构建它们的算法通过循环将两者连接起来。也许上面的代码可以转换为一个函数,该函数返回准备好插入表单的连接数组。
顺便说一句,查看您的代码,Exit For
丢失了。即使在找到客户名称之后,您也需要它来阻止代码继续执行。
For i = 2 To LastRow
If Worksheets("Sheet1").Cells(i, 1).Value = Cust_Name Then
TextBox1.Text = Worksheets("Sheet1").Cells(i, 2).Value
TextBox2.Text = Worksheets("Sheet1").Cells(i, 3).Value
TextBox3.Text = Worksheets("Sheet1").Cells(i, 4).Value
Exit For
End If
Next