簡體   English   中英

用於測試和更改用戶范圍輸入的行號和工作表索引號的 VBA 函數

[英]VBA Function to test and change user range input's row number and sheet index no

我正在嘗試使用 VBA 中的自定義函數執行一項非常簡單的任務。

我有一個宏,它遍歷被分成 50,000 行的大 Excel 數據文件。

不幸的是,我無法將這些全部拼接在一起並向下循環列,因為這通常超過 excel 中每張紙的 1,048,576 行限制。

我的宏將遍歷數據直到滿足條件,並記錄其行號以供將來參考。 顯然,當它到達任何行 >50,000 時,它需要移動到下一張紙並繼續迭代過程。

但是,我無法處理 50,000 限制兩側的值,例如: sheets(3).Cells(50021,2)

我需要的是這樣的:

輸入:

customfunction(sheets(3).Cells(50021,2))

輸出:

sheets(4).Cells(21,2)
Public Type SheetPositions
  SheetIndex As Long
  RowNumber As Long
End Type

Public Function TranslateRange(ByVal c As Range) As Range
  With TranslatePositions(c.Worksheet.Index, c.Row)
    Set TranslateRange = c.Worksheet.Parent.Worksheets(.SheetIndex).Cells(.RowNumber, c.Column)
  End With
End Function

Public Function TranslatePositions(ByVal SheetIndex As Long, ByVal RowNumber As Long) As SheetPositions
  Const ROWS_PER_SHEET As Long = 50000

  If RowNumber <= ROWS_PER_SHEET Then
    TranslatePositions.SheetIndex = SheetIndex
    TranslatePositions.RowNumber = RowNumber
  Else
    TranslatePositions.SheetIndex = SheetIndex + RowNumber \ ROWS_PER_SHEET
    TranslatePositions.RowNumber = RowNumber Mod ROWS_PER_SHEET
  End If
End Function
Dim r As Range
Set r = Worksheets(2).Cells(50021, 1)
Set r = TranslateRange(r)
With TranslatePositions(3, 50021)
  MsgBox "Sheet " & .SheetIndex & " row " & .RowNumber
End With

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM