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 工作并不重要。也不是您的工作表是Sheet1B13TextBox1 等。对于 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 中的偏移匹配函数的主要内容,如果未能解决你的问题,请参考以下文章

jQuery CSS 的操作函数

Userform在通过命令VBA.Userform.Add(“UF”)加载时重新初始化

jquery实现高度的获取-位置函数

函数返回与函数参数中的 Haskell 模式匹配

jQuery offset()函数 和 scrollTop()函数

ocaml 中的匹配是不是调用构造函数?