Код VBA для динамического VLookup между двумя открытыми таблицами из MS Access 2010 - PullRequest
0 голосов
/ 14 марта 2012

Я выбрал другой подход к рабочему проекту и врезался в стену.Я отправил в Google все, что могу придумать, и проверил несколько форумов, прежде чем вернуться в SO, чтобы попросить о помощи.У меня есть форма в Access, которая позволяет пользователям вводить комбинацию клиент / подразделение, проверяет, существует ли существующий путь к файлу для этого клиента, затем открывает файлы шаблонов Excel и сохраняет их в нужную папку с именем конкретного клиента.Кажется, все это работает нормально.Вот та часть, которая полностью меня озадачила.Следующей частью этого будет открытие двух из файлов Excel, присваивающих файлы Workbooks как переменные xlWB1 и xlWB2 и Worksheets как xlWS1 и xlWS2 (Sheet1).Мне нужно начать с xlWB1.xlWS1. (Ячейка D2) и выполнить VLookup для значения (номера элемента) этой ячейки против значений ячеек в диапазоне xlWB2.xlWS2.Range (D2: D1937).Я надеялся подсчитать общее количество строк в каждом рабочем листе перед запуском VLookup, чтобы я мог присвоить это значение переменной и использовать эту переменную для определения нижней части диапазона.Я собираюсь заранее извиниться, если ответ на этот вопрос прост.Я никогда не пытался выполнять какие-либо операции в Excel из Access с использованием VBA, поэтому я также борюсь с синтаксисом.Пожалуйста, дайте мне знать, если мой вопрос не ясен или есть какая-либо дополнительная информация, которая вам нужна.Я вставил свой стартовый код ниже.

ОБНОВЛЕННЫЙ КОД В СЛУЧАЕ, КАКОЙ-ЛИБО НУЖНО ИСПОЛЬЗОВАТЬ ЕГО!СПАСИБО ВСЕМ ЗА ПОМОЩЬ !!

Sub modExcel_SixMonth()

    Const WB_PATH As String = "\\FMI-FS\Users\sharp-c\Desktop\TestDir\"

    Dim xlApp As Excel.Application

    Dim xlWB As Excel.Workbook
    Dim xlWS As Excel.Worksheet
    Dim xlRng As Excel.Range
    Dim rCount As Long

    Dim xlWB2 As Excel.Workbook
    Dim xlWS2 As Excel.Worksheet
    Dim rCount2 As Long
    Dim sFormula As String

    Dim i As Long
    Dim xlSheetName As String
    Dim bolIsExcelRunning As Boolean

    On Error Resume Next
    Set xlApp = GetObject(, "Excel.Application")
    If Err.Number <> 0 Then
        Set xlApp = CreateObject("Excel.Application")
    Else
        bolIsExcelRunning = True
    End If

    xlApp.Visible = False

    Set xlWB = xlApp.Workbooks.Open(WB_PATH & "acct 900860 Kentucky RSTS.xlsx")
    Set xlWS = xlWB.Sheets(1)

    Set xlWB2 = xlApp.Workbooks.Open(WB_PATH & "acct 900860 six months.xlsx")
    Set xlWS2 = xlWB2.Sheets(1)

    xlSheetName = xlWS2.Name

    ' rCount: RSTS Row Count
    rCount = xlWS.Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count
    Debug.Print "rCount : " & rCount

    ' rCount2: 6 Months Row Count
    rCount2 = xlWS2.Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count
    Debug.Print "rCount2 : " & rCount2

    xlWS.Activate

    With xlWS
        For i = 2 To rCount

            sFormula = "=VLOOKUP(C" & i & ", '" & WB_PATH & "[" & "acct 900860 six months.xlsx" & "]" & _
                       xlSheetName & "'!$D$2:$D$" & rCount2 & ", 1, 0)"

            Debug.Print sFormula
            .Range("D" & i).Formula = sFormula
            DoEvents
        Next
    End With

    xlWB.Save

    xlWB2.Close False                       'Closes WB Without Saving Changes
    Set xlWB2 = Nothing

    Set xlWS = Nothing
    xlWB.Close
    Set xlWB = Nothing

    If Not bolIsExcelRunning Then
    xlApp.Quit
    End If

    Set xlApp = Nothing

End Sub

Ответы [ 2 ]

3 голосов
/ 15 марта 2012

Я думаю, что это может быть ближе к тому, что вам нужно.Требуется только один экземпляр Excel для обеих книг ...

Sub modExcel_SixMonth()

Const WB_PATH As String = "C:\Documents and Settings\Chris\Desktop\TestDir\"

Dim xlApp As Excel.Application
Dim xlWB As Excel.Workbook
Dim xlWS As Excel.Worksheet
Dim xlRng As Excel.Range
Dim rCount As Long

Dim xlWB2 As Excel.Workbook
Dim xlWS2 As Excel.Worksheet
Dim xlRng2 As Excel.Range
Dim rCount2 As Long
Dim sFormula As String

    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = True

    Set xlWB = xlApp.Workbooks.Open(WB_PATH & "acct 900860 Kentucky RSTS.xlsx")
    Set xlWS = xlWB.Sheets(1)

    Set xlWB2 = xlApp.Workbooks.Open(WB_PATH & "acct 900860 six months.xlsx")
    Set xlWS2 = xlWB2.Sheets(1)

    ' rCount: RSTS Row Count
    rCount = xlWS.Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count - 1
    Debug.Print "rCount : " & rCount

    ' rCount2: 6 Months Row Count
    rCount2 = xlWS2.Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count - 1
    Debug.Print "rCount2 : " & rCount2

    sFormula = "=VLOOKUP(C2," & xlWS2.Range("D2:D1937").Address(True, True, , True) & _
                ",1,FALSE)"

   Debug.Print sFormula
   With xlWS
       .Range("D2").Formula = sFormula
   End With

End Sub
1 голос
/ 15 марта 2012

Вы пытались использовать один и тот же объект приложения?Я полагаю, что это был комментарий к этому вопросу ранее.

Кроме того, если это не сработает, вы можете использовать метод find объекта range.Т.е.

XLWB2.Range("Your range here").find(XLWB1.Range( _
    "Cell containing value you're looking for").Value,lookat:=xlwhole)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...