Использование VBA для ввода функции vlookup в ячейке с использованием файла, выбранного пользователем

Я пытаюсь создать подпрограмму, которая будет вводить формулу в ячейку, заполнять формулу vlookup до последней строки, затем копировать формулу и pastespecial->values для всего диапазона. Таблица, которую я использую в vLookup, находится в отдельном файле, который не всегда хранится в одном месте. Таблица всегда форматируется одинаково, но размер таблицы не всегда одинаков.

Я должен сделать это на 4 разных листах, и столбец, в который я должен ввести эту формулу, имеет заголовок «Оценка заказа». Я использую .Find, чтобы вернуть местоположение "Order Grade". Затем я хочу ввести свою строку Vlookup 1 ниже, где находится «Оценка заказа».

если я введу формулу вручную на листе, она будет выглядеть так:

=VLOOKUP(C2,[newpipe.xlsx]Sheet1!$A$1:$B$376,2,FALSE)    

в VBA формула, которую я хочу построить, будет выглядеть примерно так:

=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 для первого построения строки. "ошибка приложения или объекта"

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

person John Young    schedule 22.10.2013    source источник
comment
Вам нужно будет открыть файл, чтобы узнать количество строк / столбцов. Поскольку вы возвращаете только значения из столбца B, действительно ли вам нужно знать, сколько столбцов имеется в источнике? И вы можете просто угадать большее, чем нужно значение для количества строк (или использовать целые столбцы).   -  person Tim Williams    schedule 23.10.2013
comment
нет, не нужно знать количество столбцов. Просто количество строк. Я предполагаю, что использование очень большого номера строки действительно будет работать нормально. Как насчет того, чтобы расположение файла было выбрано пользователем? Как мне правильно отформатировать это в функции vlookup?   -  person John Young    schedule 23.10.2013
comment
Разве ваша замена не должна быть `\` на '[\' (поскольку строка перевернута ...)?   -  person Tim Williams    schedule 24.10.2013


Ответы (1)


Не проверено:

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
person Tim Williams    schedule 23.10.2013
comment
Я попробую это сделать в течение следующего часа или двух и расскажу, как это работает. Спасибо Тим - person John Young; 23.10.2013
comment
aCell.Offset (-1, -1) .Address (False, False) дает мне ошибку приложения или объекта. Кроме того, после тестирования строки вручную, она не работает. Правильная строка: = ВПР (B4, 'C: \ Documents and Settings \ Orders [orders.xlsx] Sheet1'! $ A: $ B, 2, FALSE) - person John Young; 24.10.2013
comment
У меня исправлена ​​ошибка, это отрицательное число, которое ее вызывало. Если бы я мог придумать, как разместить первый [в середине строки, то все сработало бы нормально. Замена последнего \ на [должна исправить строку. Также каждый раз, когда у меня есть отрицательное число в aCell.Offset для строки или столбца, программа вылетает. С положительным числом или нулем все работает нормально. - person John Young; 24.10.2013
comment
Возможно, я ошибся в некоторых из этих смещений - извините, я не потратил слишком много времени на синтаксический анализ вашего опубликованного кода. Если ячейка оценки заказа находится в первой строке / столбце, отрицательное смещение вызовет ошибку. - person Tim Williams; 24.10.2013
comment
У меня код работает ... Почти. Я не могу правильно установить значение ячейки. Строка построена правильно, однако я не могу установить значение ячейки для строки. Может быть, мне нужно использовать .value вместо .formula? - person John Young; 24.10.2013