2009-07-15 49 views
0

我几乎让我的代码工作,但它仍然有两个错误(无论如何,两件大事)。如何使循环中的绝对单元格参考工作和跳过循环中的列?

1)绝对细胞参考。不能像Excel那样工作。我想要例如$ A5,而不是更改为A6 A7等,它在整个循环中保持A5。

2)有第三列,我需要跳过。我只需要将我的循环写入VOL和CAP下的列,而不是%UTIL。我如何告诉我的循环跳过$ UTIL?

alt text http://i27.tinypic.com/2dig8hu.jpg

Option Explicit 
Dim myRange As Range 

Function numberOfRows() As Integer 
    Debug.Print ("Start test") 

    ThisWorkbook.Worksheets("LCI").Range("A9").Select 

    Set myRange = Range(Selection, Selection.End(xlDown)) 

    Debug.Print ("Rows: " & myRange.Rows.Count) 

    numberOfRows = (myRange.Rows.Count) 
End Function 

Function numberOfColumns() As Integer 
    Debug.Print ("Start test") 

    ThisWorkbook.Worksheets("LCI").Range("B8").Select 

    Set myRange = Range(Selection, Selection.End(xlToRight)) 

    Debug.Print ("Columns: " & myRange.Columns.Count) 

    numberOfColumns = (myRange.Columns.Count) 
End Function 

Sub TieOut(ByVal numberOfRows As Integer, ByVal numberOfColumns As Integer) 
    Dim i As Integer 'i is row 
    Dim j As Integer 'j is column 

    For i = 1 To numberOfRows 'Loop over rows 
     For j = 1 + 2 To numberOfColumns 'Loop over columns 
     ThisWorkbook.Worksheets("Loop").Select 
      With ThisWorkbook.Worksheets("Loop") 
       **.Cells(i + 3, j + 1).Value = "=INDEX('ZAINET DATA'!$A$1:$H$39038,MATCH(Loop!B$2&TEXT(Loop!$A4,""M/D/YYYY""),'ZAINET DATA'!$C$1:$C$39038,0),4)" 
       .Cells(i + 3, j + 2).Value = "=INDEX('ZAINET DATA'!$A$1:$H$39038,MATCH(Loop!B$2&TEXT(Loop!$A4,""M/D/YYYY""),'ZAINET DATA'!$C$1:$C$39038,0),5)"** 
      End With 
     Next j 
    Next i 
End Sub 

Sub Test() 
    Dim x As Integer 
    Dim y As Integer 
    x = numberOfRows() 
    y = numberOfColumns() 

    Call TieOut(x, y) 
End Sub 

回答

0

你上哪儿去定义它?它是BAS模块的一部分吗?

编辑:把选项显式的作为BAS模块的第一行& compile(调试菜单 - >编译)。
你会看到有编译错误。

从Macro1删除Dim myRange As Range & Macro2。
将它放在BAS模块的顶部(显式选项后)

注意:如果您将变量定义为SUB的一部分,其他SUB/Functions将无法使用它。对于TieOut使用myRange,它必须在所有SUB可以使用的范围内定义。

另外,宏1应该首先运行 - 其中值分配给MyRange (即集MyRange = .....)
如果宏1没有运行,MyRange将持有没有价值&因此会有运行时错误时您的代码尝试读取属性(MyRange.Rows.Count)。

请花些时间阅读关于变量的范围。
变量需要保存一些值,然后再尝试读取它。

+0

我的numberOfRows = Macro1返回的数字numberOfColumns = Macro2返回的数字 – Techgirl09 2009-07-15 18:54:28

+0

Define是什么意思? – Techgirl09 2009-07-15 18:57:52

0

这是学习'范围'的好例子。您声明(或创建)一个变量,如您想要创建的范围。它存在于你所做的宏(或子程序)中。但是,当子过程完成时,变量不再有地方存活并被逐出(从计算机内存中退出)。

不幸的是,你编写你的宏的方式不会按照你希望工作的方式工作。每当他们到达End Sub时,你的myRanges都会死亡。

另外,当将参数(您的byvals)传递给另一个子过程(在本例中为您的TieOut)时,您必须提供正确数量的参数。你的TieOut程序目前需要两个。你不能通过一个,然后通过另一个。正确的方法是这个样子:

Call TieOut(myRange.Rows.Count, myRange.Columns.Count) 

而且你想叫一个名为TieOut2程序。不知道这是否是一个错字,但获取正确的程序名是重要的。

VBA非常强大,值得我学习。你看起来像在抓表面。我肯定会在网上搜索一些VBA教程。注意调用过程,变量声明和范围,我保证你将能够解决你的问题:D