繁体   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