2012-02-26 146 views
6

我对vba(excel)中的单元格和范围感到困惑。从逻辑上讲,我可以将一个单元看作size = 1的范围;我认为从一个单元格制作一个范围是很容易的。Excel vba:类型范围和单元格

如果我读了EntireRow属性的api here 它对范围进行操作。但是,下面的代码的工作,指示“内循环cell'variable是一个范围

Set import = Sheets("import") 
    Set spRange = import.Range("A2") 
    Set spRange = import.Range("A2:" & spRange.End(xlDown).Address) 
    For Each cell In spRange 
     dict.Add cell.Offset(0, 2).Text, cell.EntireRow 
    Next cell 

与此同时,下面的代码返回指示类型不匹配调用removecell功能时出错。在函数定义中应该是什么类型的targetCell

Set spRange = mySheet.Range("b2", mySheet.Range("b2").End(xlDown)) 
For Each cell In spRange 
    val = removecell (cell) 
Next cell 


Public Function removecell(targCell As Range) As Boolean 
    removecell = False 
End Function 
+0

你是对的。单元格是一个有1项的范围。 ''''''''''''''布尔型'? – shahkalpesh 2012-02-26 18:21:38

+0

是的。当我传递“cell.Text”时,此方法先前正在工作,并在remove方法cellVal As String中接受它。现在我试图通过传递单元格而不是cell.Text – bsr 2012-02-26 18:27:23

回答

4

这编译和运行:

Sub Tester() 
Dim spRange As Excel.Range 
Dim cell As Excel.Range 
Dim mySheet As Excel.Worksheet 
Dim val As Boolean 

Set mySheet = ActiveSheet 
Set spRange = mySheet.Range("b2", mySheet.Range("b2").End(xlDown)) 
For Each cell In spRange 
    val = removecell(cell) 
Next cell 

End Sub 

Public Function removecell(targCell As Range) As Boolean 
    removecell = False 
End Function 
+0

谢谢。 “Dim cell As Excel.Range”给了我一个线索,因为我之前没有明确声明单元格。正如我所提到的,我只是转换了这个方法,之前我不需要明确地声明单元格。我得到的错误是有点误导。 – bsr 2012-02-26 18:48:36

+2

Range对象的默认值是Value,所以Cell没有被声明为Range时,Cell被假定为一个Value,这足够合理地导致“类型不匹配”。声明所有变量是非常好的做法。为了强制这个,在VBE中选择工具>选项>编辑器>需要变量声明。这会将Option Explicit添加到所有新模块的顶部,并为未声明的变量提供“变量未定义”编译器错误。您也可以在现有模块的顶部键入Option Explicit。 – 2012-02-26 19:21:44

+0

+1好的提示声明变量! – 2012-02-26 20:58:57