我有一个函数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”的标签。没有这种运气。
答案 0 :(得分:2)
首先,为了清楚起见,我建议使myDate
和myCol
都键入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