如何将范围从excel存储到范围variables?

我正在使用VBA读取excel的一些单元格。

Function getData(currentWorksheet as Worksheet, dataStartRow as Integer, _ dataEndRow as Integer, DataStartCol as Integer, dataEndCol as Integer) Dim dataTable as Range dataTable = currentWorksheet.Range(currentWorksheet.Cells(dataStartRow, _ dataStartCol), currentWorksheet.Cells(dataEndRow, dataEndCol)) getData = dataTable EndFunction 

它会抛出一个错误,对象variables或块variables未设置。 如何把这个范围在一个variables? 请指导我

在使用Range对象时,不能简单地使用以下语法:

 Dim myRange as Range myRange = Range("A1") 

您必须使用set关键字来分配Range对象:

 Function getData(currentWorksheet As Worksheet, dataStartRow As Integer, dataEndRow As Integer, DataStartCol As Integer, dataEndCol As Integer) Dim dataTable As Range Set dataTable = currentWorksheet.Range(currentWorksheet.Cells(dataStartRow, DataStartCol), currentWorksheet.Cells(dataEndRow, dataEndCol)) Set getData = dataTable End Function Sub main() Dim test As Range Set test = getData(ActiveSheet, 1, 3, 2, 5) test.select End Sub 

请注意,每次声明范围时,都使用Set关键字。


你也可以让你的getData函数返回一个Range对象而不是一个Variant尽pipe这与你所遇到的问题无关。

什么是currentWorksheet ? 它使用内置的ActiveSheet

 dataStartRow=1 dataStartCol=1 dataEndRow=4 dataEndCol=4 Set currentWorksheet=ActiveSheet dataTable = currentWorksheet.Range(currentWorksheet.Cells(dataStartRow, dataStartCol), currentWorksheet.Cells(dataEndRow, dataEndCol)) 

定义GetData是什么。 目前尚未确定。

 Function getData(currentWorksheet as Worksheet, dataStartRow as Integer, dataEndRow as Integer, DataStartCol as Integer, dataEndCol as Integer) as variant 

声明你的昏暗作为一个变种,并从数组中拉出数据。 即

 Dim y As Variant y = Range("A1:B2") 

现在你的excel范围全是1个variables(数组),y

要拉数据,请调用“A1:B2”范围内的数组位置或任何您select的数组。 例如:

 Msgbox y(1, 1) 

这将返回“A1:B2”范围内的左上angular框。

这里是一个允许在所需区域的每一行上执行代码的例子(从select的顶部和底部select,或从select的底部select)

 Sub doROWSb() 'WORKS for do selected rows SEE FIX ROWS ABOVE (small ver) Dim E7 As String 'note: workcell E7 shows: BG381 E7 = RANGE("E7") 'see eg below Dim r As Long 'NOTE: this example has a paste formula(s) down a column(s). WILL REDUCE 10 HOUR DAYS OF PASTING COLUMNS, DOWN TO 3 MINUTES? Dim c As Long Dim rCell As RANGE 'Dim LastRow As Long r = ActiveCell.row c = ActiveCell.Column 'might not matter if your code affects whole line anyways, still leave as is Dim FirstRow As Long 'not in use, Delete if only want last row, note: this code already allows for selection as start Dim LastRow As Long If 1 Then 'if you are unable to delete rows not needed, just change 2 lines from: If 1, to if 0 (to go from selection last row, to all rows down from selection) With Selection 'FirstRow = .Rows(1).row 'not used here, Delete if only want last row LastRow = .Rows(.Rows.Count).row 'find last row in selection End With application.CutCopyMode = False 'if not doing any paste op below Else LastRow = Cells(Rows.Count, 1).End(xlUp).row 'find last row used in sheet End If application.EnableEvents = True 'EVENTS need this? application.ScreenUpdating = False 'offset-cells(row, col) 'RANGE(E7).Select 'TOP ROW SELECT RANGE("A1") = vbNullString 'simple macros on-off switch, vb not here: If RANGE("A1").Value > 0 Then For Each rCell In RANGE(Cells(r, c), Cells(LastRow, c)) 'new rCell.Select 'make 3 macros for each paste macro below 'your code here: If 1 Then 'to if 0, if want to paste formulas/formats/all down a column Selection.EntireRow.Calculate 'calcs all selected rows, even if just selecting 1 cell in each row (might only be doing 1 row aat here, as part of loop) Else 'dorows() DO ROWS() 'eg's for paste cells down a column, can make 3 separate macros for each: sub alte() altf & altp Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'make sub alte () add thisworkbook: application.OnKey "%{e}", "alte" 'Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'make sub altf () add thisworkbook: application.OnKey "%{f}", "altf" 'Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'amke sub altp () add thisworkbook: application.OnKey "%{p}", "altp" End If Next rCell 'application.CutCopyMode = False 'finished - stop copy mode 'RANGE("A2").Select goBEEPS (2), (0.25) 'beeps secs application.EnableEvents = True 'EVENTS 'note: workcell E7 has: SUBSTITUTE(SUBSTITUTE(CELL("address",$BG$369),"$",""),"","") 'other col eg (shows: BG:BG): =SUBSTITUTE(SUBSTITUTE(CELL("address",$BG2),"$",""),ROW(),"")&":"& SUBSTITUTE(SUBSTITUTE(CELL("address",$BG2),"$",""),ROW(),"") End Sub 'OTHER: Sub goBEEPSx(b As Long, t As Double) 'beeps secs as: goBEEPS (2), (0.25) OR: goBEEPS(2, 0.25) Dim dt 'as double 'worked wo as double Dim x For b = b To 1 Step -1 Beep x = Timer Do DoEvents dt = Timer - x If dt < 0 Then dt = dt + 86400 '86400 no. seconds in a day, in case hit midnight & timer went down to 0 Loop Until dt >= t Next End Sub