VBA:我可以使用用户输入来指定要在哪个选项卡上运行VLOOKUP吗?

时间:2018-08-17 21:02:00

标签: excel vba excel-vba

我有一个函数TwoParVlookup(您猜对了),它使用两个参数运行Vlookup。我目前正在尝试自动使用此功能。 工作表中有几个以日期命名的标签(例如:08.17.16),并且每个标签上的数据都采用相同的格式。

是否可以通过某种方式指定要在其上运行TwoParVlookup的选项卡?我试图通过InputBox存储用户输入,但是宏无法识别它。这是代码:

Sub MakeMattsLifeEasier()

' This macro will use our 2-parameter Vlookup down the column (Date) our user specifies

  Dim myCol As Variant
  Dim myDate As Variant

  myCol = InputBox("Which column shall I populate?")
  myDate = InputBox("Thank you. Which date is this column assigned?")

  Range(myCol & "3").FormulaR1C1 = _
    "=TwoParVlookup(myDate!RC[9]:R[9]C[14],6,pGSK.GSK!RC[-2],pGSK.GSK!RC[-1])"
  Range(myCol & "3").Select
  Selection.AutoFill Destination:=Range(myCol & "3:" & myCol & "14"), Type:=xlFillValues


End Sub

注意:它是TwoParVlookup(数据范围,列索引,参数1,参数2)

我能够通过InputBox指定存储特定的列。我想我有点领先,并尝试使用myDate变量来实现相同目的。 例如,我将“ 08.16.18”存储到myDate中,因为有一个标题为“ 08.16.18”的标签。没有这种运气。

4 个答案:

答案 0 :(得分:2)

首先,为了清楚起见,我建议使myDatemyCol都键入String并避免为后者获取Date对象。

此外,对于这一行,您需要将myDate变量从引号“”中取出

所以:

Range(myCol & "3").FormulaR1C1 = _
"=TwoParVlookup(" & myDate & "!RC[9]:R[9]C[14],6,pGSK.GSK!RC[-2],pGSK.GSK!RC[-1])"

答案 1 :(得分:2)

使用Application.InputBox控制允许用户填充的输入。
 您可以找到要控制的输入“类型”以及其他有用的信息here!

限定工作表并使用Range(myCol & 3),而不是.Cells(3, myCOl)

Dim myCol As Integer
myCol = Application.InputBox("Which column shall I populate", Type:=1)

Thisworkbook.Sheets("Sheet1").Cells(3, myCol).FormulaR1C1 = ...... 

要控制日期输入,可以使用Type 8并让用户在要运行代码的工作表上选择一个单元格。像

Sub Macro1()

Dim myDate As Range
Set myDate = Application.InputBox("Select a cell on desired sheet", Type:=8)

Dim TargetSheet As Worksheet
Set TargetSheet = myDate.Worksheet

MsgBox TargetSheet.Name

End Sub

此外,您需要编写代码,使用户可以选择不选择InputBox上的任何内容,而是点击Cancel

答案 2 :(得分:1)

只需将InputBox的结果合并到表示您的公式的字符串中即可。

Sub MakeMattsLifeEasier()

' This macro will use our 2-parameter Vlookup down the column (Date) our user specifies

  Dim myCol As Variant, myDate As Variant

  myCol = InputBox("Which column shall I populate?")
  myDate = InputBox("Thank you. Which date is this column assigned?")

  Range(myCol & "3:" & myCol & "14").FormulaR1C1 = _
    "=TwoParVlookup('" & myDate & "'!RC[9]:R[9]C[14], 6, pGSK.GSK!RC[-2], pGSK.GSK!RC[-1])"


End Sub

我在工作表名称周围添加了'标记。如果不需要它们,那么缺少它们会破坏公式。如果它们在那里并且不需要,则不会造成伤害。

答案 3 :(得分:1)

第一件事。让我们将变量声明为实际值,而不是变量。然后,确保在输入框中键入的字符串实际上是有效日期。为此,我们将其转换为日期;检查其有效性;然后将其转换回您选择的格式的字符串。

我注意到的一个问题是您的FormulaR1C1行,因为您在公式中实际上是“ myDate”,而不是插入字符串。这已在下面更正。另请注意,您无需“选择”任何内容;并确保您使用所需的实际工作表来限定“范围”引用。这样可以避免以后出现很多问题。

Option Explicit ' Always good to use at the top of your module
Sub MakeMattsLifeEasier()
    ' This macro will use our 2-parameter Vlookup down the column (Date) our user specifies
    Dim myCol As String
    Dim DateString As String
    Dim InputDate As Date
    myCol = InputBox("Which column shall I populate?")
    If Len(myCol) > 1 Then
        MsgBox "You need to type a single column letter."
        Exit Sub
    End If
    DateString = InputBox("Thank you. Which date is this column assigned?")
    On Error GoTo NoDate
    InputDate = CDate(DateString) ' Convert to a date. If this is not a valid date, an error will be thrown.
    On Error GoTo 0 ' Reset the error handling
    ' Now we've validated that it's a real date. Convert it to your chosen format:
    DateString = Format(InputDate, "dd.mm.yyyy") ' Or however your sheets are named
    '
    With ActiveSheet ' Change ActiveSheet to specify the sheet you actually want
        .Range(myCol & "3").FormulaR1C1 = "=TwoParVlookup(" & DateString & "!RC[9]:R[9]C[14],6,pGSK.GSK!RC[-2],pGSK.GSK!RC[-1])"
        .Range(myCol & "3").AutoFill Destination:=.Range(myCol & "3:" & myCol & "14"), Type:=xlFillValues
    End With
    Exit Sub
NoDate:
    MsgBox "Not a valid date."
End Sub