Excel 使用VBA使用用户选择的文件在单元格中输入vlookup函数

Excel 使用VBA使用用户选择的文件在单元格中输入vlookup函数,excel,vba,formula,vlookup,filedialog,Excel,Vba,Formula,Vlookup,Filedialog,我正在尝试构建一个将公式输入到单元格中的sub,将vlookup公式填充到lastrow,然后复制公式并粘贴整个范围的特殊->值。我在vLookup中使用的表位于一个单独的文件中,该文件并不总是存储在同一个位置。表格的格式始终相同,但表格大小并不总是相同 我必须在4个不同的工作表上完成这项工作,我必须在其中输入公式的列有一个订单等级的标题。我使用.Find返回订单等级的位置。然后我想在订单等级的下方输入我的Vlookup 1行 如果我在工作表上手动输入公式,则如下所示: =VLOOKUP(C2,

我正在尝试构建一个将公式输入到单元格中的sub,将vlookup公式填充到lastrow,然后复制公式并粘贴整个范围的特殊->值。我在vLookup中使用的表位于一个单独的文件中,该文件并不总是存储在同一个位置。表格的格式始终相同,但表格大小并不总是相同

我必须在4个不同的工作表上完成这项工作,我必须在其中输入公式的列有一个订单等级的标题。我使用.Find返回订单等级的位置。然后我想在订单等级的下方输入我的Vlookup 1行

如果我在工作表上手动输入公式,则如下所示:

=VLOOKUP(C2,[newpipe.xlsx]Sheet1!$A$1:$B$376,2,FALSE)    
=vlookup(RC[-1],stringFileName\[newpipe.xlsx]Sheet1!$A$1:LastColumn & LastRow,2,False
在VBA中,我要构造的公式如下所示:

=VLOOKUP(C2,[newpipe.xlsx]Sheet1!$A$1:$B$376,2,FALSE)    
=vlookup(RC[-1],stringFileName\[newpipe.xlsx]Sheet1!$A$1:LastColumn & LastRow,2,False
用户使用“打开文件”对话框选择stringFileName。所选图纸上的LastColumn和LastRow应由宏计算

这是我到目前为止所拥有的

Private Function UseFileDialogOpen()
Dim myString As String
' Open the file dialog
With Application.FileDialog(msoFileDialogFilePicker)
    .AllowMultiSelect = False
    .Show
    If .SelectedItems.Count = 1 Then
        myString = .SelectedItems(1)
        'MsgBox myString
        UseFileDialogOpen = myString
    Else
        MsgBox ("Failed to properly open file")
        myString = "fail"
        UseFileDialogOpen = myString
    End If
End With
End Function

Sub formatOrderColumn()
Dim strSearch
Dim foundColumn
Dim foundRow
Dim RowBelowSpotFound
Dim fileLocation

strSearch = "Order Grade"

Set aCell = ActiveSheet.Rows(1).Find(what:=strSearch, LookIn:=xlValues, _
Lookat:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=True, SearchFormat:=False)

If Not aCell Is Nothing Then
    foundColumn = aCell.Column
    foundRow = aCell.Row
    spotFound = ColumnLetter(foundColumn) & foundRow + 1
'    MsgBox "Value Found in Row " & foundRow & _
    " and the Column Number is " & foundColumn
Else
    Exit Sub
End If

fileLocation = UseFileDialogOpen()
LastColumn = FindLastColumn(UserSelectedSheet)
LastRow = FindLastRow(UserSelectedSheet)
Range(RowBelowSpotFound).Formula = _
    "=vlookup(RC[-1], [" & fileLocation & "]Sheet1!$A$1:" & LastColumn & lastrow & ",2,False"
End Sub
我不知道如何从用户选择的文件中获取lastrow和lastColumn。对于传递给它们的任何工作表,我都有这样做的函数。我意识到我在解释我的处境时做得很糟糕,我根本不确定我是否能以最好的方式来处理这件事。如果你有任何问题,让我知道,我会尽我所能澄清。我马上就要离开办公室了,所以可能要到早上才能回复

这是一个新的公式。当我尝试将偏移单元公式设置为字符串值时,最后一行出现错误。字符串值是正确的。如果我尝试直接设置单元格值,而不使用mystring holder首先构建字符串,则会出现相同的错误。应用程序或对象定义错误

Sub vlookupOrderGrade()

Dim strSearch
Dim fileLocation
Dim aCell As Range
Dim aCellString
Dim myString As String
strSearch = "Order Grade"

Set aCell = ActiveSheet.Rows(1).Find(what:=strSearch, LookIn:=xlValues, _
                                 Lookat:=xlWhole, MatchCase:=True)
If Not aCell Is Nothing Then
    fileLocation = UseFileDialogOpen()
    If fileLocation <> "fail" Then
        'replace last "\" with a "["
        fileLocation = StrReverse(fileLocation)
        fileLocation = Replace(fileLocation, "\", "[", 1, 1)
        fileLocation = StrReverse(fileLocation)
        'build string
        myString = "=vlookup(" & _
                     ColumnLetter(aCell.Column - 1) & aCell.Row + 1 & _
                     ", '" & fileLocation & "]Sheet1'!$A:$B,2,False"
        MsgBox (myString)
        'set cell to string
        aCell.Offset(1, 0).Formula = myString
    End If
Else
    Exit Sub
End If
End Sub
未经测试:

Sub formatOrderColumn()

Dim strSearch
Dim fileLocation

strSearch = "Order Grade"

Set aCell = ActiveSheet.Rows(1).Find(what:=strSearch, LookIn:=xlValues, _
                                     Lookat:=xlWhole, MatchCase:=True)

    If Not aCell Is Nothing Then

        fileLocation = UseFileDialogOpen()
        If fileLocation <> "fail" Then

            aCell.Offset(1, 0).Formula = "=vlookup(" & _
                         aCell.Offset(1, -1).Address(False, False) & _
                         ", '[" & fileLocation & "]Sheet1'!$A:$B,2,False"
        End If
    Else
        Exit Sub
    End If

End Sub

您需要打开该文件以获取行/列计数。由于您只从B列返回值,您真的需要知道源中有多少列吗?您可以猜测行数大于所需的值,或者使用整个列。不,不需要知道列数。只是行数。我想使用一个非常大的行号实际上可以很好地工作。让用户选择文件位置怎么样?我如何将其正确格式化为vlookup函数?您的替换项不应该是“to”吗[\'因为字符串是反向的。我将在接下来的一两个小时内尝试一下,并让您知道它是如何工作的。感谢timaCell.Offset-1,-1.AddressFalse,False给了我应用程序或对象定义的错误。另外,在手动键入字符串测试后,它也不太工作。正确的字符串是:=VLOOKUPB4,'C:\Documents aND设置[Orth.xLSx] SeET1'!$a:$B,2,FalsII有固定的错误,它是导致它的负数。如果我能找出如何放置第一个[在中间的字符串,那么它会工作得很好。[应该修复字符串。而且,每当我在aCell中有一个负数时,行或列的偏移量,程序就会崩溃。如果是正数或零,它就可以正常工作。我可能有些偏移量弄错了-很抱歉,我没有花太长时间解析您发布的代码。如果订单级别单元格位于第一行/列中,则为负数偏移量将引发错误。我的代码正在运行…几乎。我无法正确设置单元格值。字符串已正确生成,但我无法将单元格值设置为字符串。也许我必须使用.value而不是.formula?