VBA/Userform 中的偏移匹配函数
Posted
技术标签:
【中文标题】VBA/Userform 中的偏移匹配函数【英文标题】:Offset Match function in VBA/Userform 【发布时间】:2018-10-16 21:32:54 【问题描述】:我正在尝试设置一个用户表单,其中在组合框中选择的值决定了偏移匹配函数的范围。查找值在同一用户窗体中的文本框 (TextBox1) 中输入。
If ComboBox1 = "Something" Then
TryRun = Evaluate("Offset(Sheets('Sheet1').Range('B13'),MATCH(TextBox1.Value,Sheets('Sheet1').Range('B14:B33'),0),5)")
End If
目前这会返回单元格 G15 的值,但我需要它做的是简单地选择该单元格并将 Textbox (TextBox2) 的值粘贴到用户窗体中。
这似乎不起作用,
Cells(TryRun).Value = TextBox2
,
因为它找不到“TryRun”的定义对象。但是,看到 this 指的是一个单元格,我不知道如何定义它。
谁能帮帮我?
我已经尝试了 Ahmed 的 U Vlookup 解决方案来得到这个:
Private Sub OkButton_Click()
If Combobox1 = "Something" Then
TryRun = WorksheetFunction.VLookup(Val(Textbox1.Text), Range("B14:G33"), 6, False)
If IsEmpty(TryRun) Then
Msgbox "nope"
Textbox2.Text = "No Match found"
Else
Msgbox "almost..."
TextBox2.Value = TryRun
End If
End If
End Sub
这会导致 Textbox2 在用户表单中返回值 = 0,而通过 vlookup 函数没有粘贴任何内容。
通过删除on error
行,代码将停止工作,错误行是TryRun = WorksheetFunction.VLookup(Val(Textbox1.Text), Sheets("Stuff").Range("B14:G33"), 6, False)
。这导致的错误是:错误 424,需要对象。
编辑:
删除Dim TryRun As Long
后,我遇到了下一个绊脚石:目前我正在返回“未找到匹配项”,而不是在指定单元格地址中尝试运行的值。
编辑 2:
不知何故,我现在在 else
语句中返回了第二个消息框。但是仍然没有值被粘贴到 TryRun 中。
【问题讨论】:
从简单的事情开始,尝试构建一个minimal reproducible example。提示 - 你在UserForm
工作并不重要。也不是您的工作表是Sheet1
、B13
、TextBox1
等。对于 MCVE,将所有这些值硬编码为易于复制的东西。或者查看address 公式并尝试将其写在某个地方。玩得开心! :)
Evaluate
用于运行工作表函数公式,不适用于 VBA。
请注释掉 'Dim TryRun As Long'。,(这只能与 WorkSheetFunction.Match 一起使用,因为它返回偏移行数)..单击 OKButton 时的 textBox1.Text 是什么?数字是否存在于 B14:B33 范围内
Error 424 on line 'TryRun=.....' 引发了对 Userform 上 Object TextBox1 存在的怀疑。在“TryRun=…”之前尝试“MsgBox TextBox1.Text”。
我删除了“Dim TryRun As Long”并添加了消息框。截至目前,我正在弹出一个带有 Textbox1 值的消息框。在那之后,我在 Textbox2 中输入的随机值被“未找到匹配项”覆盖。实际工作表上没有粘贴任何值。
【参考方案1】:
As Evaluate 用于运行工作表函数公式,而不是 @Tim Williams 评论的 VBA。有很多方法可以解决问题,否则
你可以试试WorksheetFunction.Match
Dim TryRun As Long
On Error Resume Next
TryRun = WorksheetFunction.Match(TextBox1.Value, Sheet1.Range("B14:B33"), 0)
On Error GoTo 0
If TryRun > 0 Then
TextBox2.Text = Sheet1.Range("G" & 13 + TryRun).Value
Else
TextBox2.Text = " No Match found"
End If
或者试试WorksheetFunction.Vlookup
On Error Resume Next
TryRun = WorksheetFunction.VLookup(TextBox1.Text, Sheet1.Range("B14:G33"), 6, False)
' Vookup consider 1str column as 1, Col G will be 6
On Error GoTo 0
If IsEmpty(TryRun) Then
TextBox2.Text = " No Match found"
Else
TextBox2.Text = TryRun
End If
请注意,假设只搜索文本类型的数据。对于数字类型的数据,请使用Val(TextBox1.Text)
【讨论】:
我正在尝试使用 VlookUp 方法,但它似乎没有提示任何类型的消息,也没有粘贴任何内容。为清楚起见:` If Combobox1 = "Stuff" Then On Error Resume Next TryRun = WorksheetFunction.VLookup(Val(TextBox1.Text), Sheets("Other Stuff").Range("B14:G33"), 6, False) On Error GoTo 0 If IsEmpty(TryRun) Then Textbox2.Text = "No Match found" Else TextBox2.Value = TryRun End If` 如果我忽略了一些相当明显的事情,请提前道歉。 请编辑您的帖子并尝试包含范围 B14:G33 的图像。在调用代码时是否还提到 TextBox1 中的文本,或者是否正在调用代码?可以使用 msgbox 或 immidiate window 来调试代码中的值。以上是关于VBA/Userform 中的偏移匹配函数的主要内容,如果未能解决你的问题,请参考以下文章
Userform在通过命令VBA.Userform.Add(“UF”)加载时重新初始化