Excel VBA: проблема с передачей книги, объектов листа в подпрограммы - PullRequest
0 голосов
/ 13 марта 2019

У меня есть основная процедура, которая создает новую рабочую книгу и динамически связывает с ней новые листы (на основе данных в отдельной входной книге / листе).

За исключением основной процедуры:

Sub MainRoutine()
    Dim NmOutBook As String
    NmOutBook = "Client1Output_" & Format(CStr(Now), "yyyy_mm_dd_hh_mm")

    Dim PosSourceBk, TrnSourceBk, OutputBk As Workbook
    Set PosSourceBk = Workbooks.Open("U:\Documents\Implementations\Client1\Client1Positions.xlsx")
    Set TrnSourceBk = Workbooks.Open("U:\Documents\Implementations\Client1\TradeHistory_0301.xlsx")
    Dim TrnSrcSht, TrnOutSht, PriorTrnOutSht, PosOutSht As Worksheet
    Set TrnSrcSht = TrnSourceBk.ActiveSheet

    'Create workbook to store output sheets
    Set OutputBk = Workbooks.Add

...

If (SecNm <> PriorSecNm) Then
    Set TrnOutSht = OutputBk.Sheets.Add(after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
    TrnOutShtName = CStr(SecNm) + "_b"
    TrnOutSht.Name = TrnOutShtName
    AddXactSheetHeaders OutputBk, TrnOutSht

Я передаю свой выходной объект рабочей книги и соответствующий объект рабочей таблицы в подпрограмму AddXactSheetHeaders, которая выглядит следующим образом:

Sub AddXactSheetHeaders(ByVal wb, ByVal ws)
    With wb
        With ws
            Range("A1").Value = "TradeDate"
            Range("B1").Value = "SettleDate"
            Range("C1").Value = "Tran ID"
            Range("D1").Value = "Tranx Type"
            Range("E1").Value = "Security Type"
            Range("F1").Value = "Security ID"
            Range("G1").Value = "SymbolDescription"
            Range("H1").Value = "Local Amount"
            Range("I1").Value = "Book Amount"
            Range("J1").Value = "MOIC Label"
            Range("K1").Value = "Quantity"
            Range("L1").Value = "Price"
            Range("M1").Value = "CurrencyCode"
        End With
    End With
End Sub

Результатом этого является то, что ячейки A1: M1 обновляются, но в неправильной книге / листе.

Я пытался передать ссылки на объекты по ссылке; когда я делаю это, обновляется другая (но все же неправильная) рабочая книга / рабочий лист.

Я, должно быть, упускаю что-то очевидное, но понятия не имею, что это может быть.

Любая помощь приветствуется. Благодаря.

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Используйте ByRef , чтобы передать объекты рабочей книги / листа по указателю вместо их копирования, а затем использовать их в качестве родительских ссылок в вспомогательной подпрограмме. Чтобы сослаться на Range внутри параметра With ... End With, используйте префикс периода.

Sub AddXactSheetHeaders(Byref wb as workbook, ByRef ws as worksheet)

  With wb
   With ws
     .Range("A1").Value = "TradeDate"
     .Range("B1").Value = "SettleDate"
     .Range("C1").Value = "Tran ID"
     .Range("D1").Value = "Tranx Type"
     .Range("E1").Value = "Security Type"
     .Range("F1").Value = "Security ID"
     .Range("G1").Value = "SymbolDescription"
     .Range("H1").Value = "Local Amount"
     .Range("I1").Value = "Book Amount"
     .Range("J1").Value = "MOIC Label"
     .Range("K1").Value = "Quantity"
     .Range("L1").Value = "Price"
     .Range("M1").Value = "CurrencyCode"
   End With
  End With 

End Sub

На самом деле, ссылка wb совершенно не нужна и синтаксически неверна. Рабочий лист ws знает, какова его родительская рабочая книга.

Sub AddXactSheetHeaders(ByRef ws as worksheet)

  With ws
     .Range("A1").Value = "TradeDate"
     .Range("B1").Value = "SettleDate"
     .Range("C1").Value = "Tran ID"
     .Range("D1").Value = "Tranx Type"
     .Range("E1").Value = "Security Type"
     .Range("F1").Value = "Security ID"
     .Range("G1").Value = "SymbolDescription"
     .Range("H1").Value = "Local Amount"
     .Range("I1").Value = "Book Amount"
     .Range("J1").Value = "MOIC Label"
     .Range("K1").Value = "Quantity"
     .Range("L1").Value = "Price"
     .Range("M1").Value = "CurrencyCode"
  End With 

End Sub
0 голосов
/ 13 марта 2019

Это потому, что внутри вашего With сегмента вы не используете точку (.), Чтобы указать изменение этого wb / ws.

Внутри любых сегментов With, используя точку, связывает «команду» с сегментом With. Ej:

With ThisWorkbook.Sheets("Sheet5")
    Range("A5").Value = "String Test" 'This changes the Cell A5 of the ActiveSheet
    .Range("A5").Value = "Test 2" 'This Changes the Value of Sheet5, part of the With Segment
End With

Просто добавьте точки / периоды

Sub AddXactSheetHeaders(ByVal wb, ByVal ws)
    With wb
        With ws
            .Range("A1").Value = "TradeDate"
            .Range("B1").Value = "SettleDate"
            .Range("C1").Value = "Tran ID"
            .Range("D1").Value = "Tranx Type"
            .Range("E1").Value = "Security Type"
            .Range("F1").Value = "Security ID"
            .Range("G1").Value = "SymbolDescription"
            .Range("H1").Value = "Local Amount"
            .Range("I1").Value = "Book Amount"
            .Range("J1").Value = "MOIC Label"
            .Range("K1").Value = "Quantity"
            .Range("L1").Value = "Price"
            .Range("M1").Value = "CurrencyCode"
        End With
    End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...