0

我几乎让我的代码工作了,但它仍然有两件事有问题(无论如何是两件主要的事情)。

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

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

替代文字

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
4

2 回答 2

0

你在哪里定义的?它是 BAS 模块的一部分吗?

编辑:将 Option Explicit 作为 BAS 模块的第一行并编译(调试菜单-> 编译)。
你会看到有编译错误。

Dim myRange As Range从宏 1 和宏 2 中删除。
将其放在 BAS 模块的顶部(在选项显式之后)

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

此外,Macro1 应该首先运行 - 它将值分配给 MyRange(即 Set MyRange = .....)
如果未运行 Macro1,MyRange 将不保存任何值,因此当您的代码尝试读取属性时将出现运行时错误(MyRange.Rows.Count)。

请花一些时间阅读有关变量范围的信息。
在您尝试从中读取之前,变量需要保存一些值。

于 2009-07-15T18:42:49.270 回答
0

这是了解“范围”是什么的一个很好的例子。您声明(或使存在)一个变量,例如您要创建的范围。它位于您创建的宏(或子过程)中。但是,当 sub 过程完成时,您的变量不再有住处并被逐出(从计算机的内存中删除)。

不幸的是,您编写宏的方式不会像您希望的那样工作。每次到达 End Sub 时,您的 myRanges 都会死亡。

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

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

您还试图调用名为 TieOut2 的过程。不确定这是否是一个错字,但获得正确的程序名称很重要。

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

于 2009-07-15T20:00:28.833 回答