【问题标题】:Excel VBA userform textbox having dynamic scripts using different textboxsExcel VBA用户表单文本框具有使用不同文本框的动态脚本
【发布时间】:2020-07-26 15:02:08
【问题描述】:

我是 Excel VBA 用户窗体的新手.. 我想实现以下两个问题:

1) 我有三个文本框名称客户姓名、手机号码和电子邮件 ID --> 我从 Sheet1 获取这些数据,这就像一个数据库,其中存储了所有这三列数据,并且会不时更改。 接下来,我将组合框依赖于另一个文本框 --> 这两个充当父项和子项,组合框是父项,文本框是子项,在组合框中选择的任何项目脚本将显示在文本框中。

考试: 组合框如果我选择项目“汽车”,那么它的脚本将在子文本框中显示为“名称有新车,他的手机号码是:& 电子邮件 ID 是:” 以同样的方式,我有多达 200 个这样的脚本。

我想将显示在此用户窗体上的前三个文本框数据直接填充到此脚本中,如下例所示

如果客户姓名是 John,手机号码 132132132 和电子邮件 ID test@test.com 当用户从父组合框中选择汽车时,此文本框将填充诸如“约翰有新车,他的手机号码是:132132132 & 电子邮件 ID 是:test@test.com”这样的数据,这样我就可以将数据保存在 Sheet2 中

在这 200 个脚本中,客户详细信息将改变他们在脚本中的位置。意味着少数脚本中的客户名称将出现在脚本的末尾。

2) 我还有两个相同形式的文本框,其中一个文本框用于输入客户语言,另一个文本框用于输入日期和时间(当前或特定日期和时间)。一旦我输入客户语言说英语和当前日期和时间,然后我选择更新按钮这两个文本框值需要保存在我上面解释的几个脚本上。

示例:
“约翰有新车,他的手机号码是: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 & 电子邮件 id 是: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`

还有什么需要告诉我谢谢。

【问题讨论】:

  • 请尝试将您的文字墙分解为您遇到的问题的描述。发布您的代码,发布您想要发生的事情,然后发布发生的事情。没有人会给你运行场景所需的确切代码。但是,如果您发布代码并解释什么不起作用,那么我们可以为您提供帮助。
  • @teylyn ,请立即使用屏幕截图和代码找到我的更新。谢谢

标签: excel vba combobox textbox userform


【解决方案1】:

下面的代码显示了您可以如何解决您的问题。请研究一下。

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

【讨论】:

  • 感谢您的回复.. 您对 CustDetail 的逻辑适用于将文本框放入脚本文本框,但如何调用 MyScript 直接从 Sheet2 中提取脚本 因为我在 Sheet2 列上有 200 个不同的脚本,这些脚本将更改一次我从组合框中选择。由于我已经在“脚本窗口”框架中将依赖组合框写入文本框,请检查此代码上方ComboBox1_Change() & ComboBox1_DropButtonClick(),您能否给我直接从 Sheet2 列调用的代码。谢谢
  • 例如:在 sheet2 中,如果我添加 ` "|have new||." & vbCr & _ "他的手机号码是 ||。" & vbCr & _` 像这样对所有这些不同的脚本拆分“|”由我手动一次,然后当它显示在useform文本框脚本上时它会起作用还是我们可以以这种方式制作这样我就可以使用所有脚本..?顺便说一句,我纠正了Exit For 谢谢..
  • 和你说的一模一样。因此,您发现了问题,但随后您停止了思考。您所有的 200 多个脚本中的每个必须有 6 个插入,而不是 mor 或更少,这是由表单中的文本框数量加上时间所规定的。因此,它们都可以写在我上面介绍的 Const MyScript 的模式上。因此,它们都可以使用相同的代码与 TextBoxes 的内容一起组装,本质上,我已经提供了这些代码。您需要做的就是重新编写您的 200 个脚本。这是较小的邪恶。
猜你喜欢
  • 1970-01-01
  • 2018-12-12
  • 2019-09-13
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 2017-06-16
相关资源
最近更新 更多