2

我是一名初级程序员(没有经验),正在为我现在正在做的工作学习 Visual Basic。我已经阅读了一天左右,终于决定开始制作所需的程序!

但是,我遇到了一些问题。

现在我有两个子程序。第一个子例程让用户输入他们有多少数据对,这样我就可以创建一个表格供他们填写。这样他们的数据就在正确的位置供我以后参考。

然后他们在完成输入数据后按下一个按钮以启动一个不同的子程序,该子程序将对他们输入的数字进行一些计算。我的问题是我需要一个变量来说明他们必须将多少数据对转移到第二个例程。

在我继续之前,这是我到目前为止的代码!(您必须在窗口中向下滚动)我还应该注意第二个子例程在一个单独的模块中。

Option Explicit

Public Counter As Long


Sub TableCreation1()

    ActiveSheet.Shapes.Range(Array("Button 5")).Select

    Selection.Delete

    Counter = InputBox("How many pairs of data do you have? ")

    Range("A1") = "Time (days)"

    Range("B1") = "CFL (measured)"

    Range("A1:B1").Font.Bold = True

    Columns("A:B").EntireColumn.EntireColumn.AutoFit

    Range("A1").Select

    ActiveCell.Range("A1:B" & Counter + 1).Select

    Selection.Borders(xlDiagonalDown).LineStyle = xlNone

    Selection.Borders(xlDiagonalUp).LineStyle = xlNone

    With Selection.Borders(xlEdgeLeft)

       .LineStyle = xlContinuous

       .Weight = xlThin

    End With

    With Selection.Borders(xlEdgeTop)

        .LineStyle = xlContinuous

        .Weight = xlThin

    End With

    With Selection.Borders(xlEdgeBottom)

        .LineStyle = xlContinuous

        .Weight = xlThin

    End With

    With Selection.Borders(xlEdgeRight)

        .LineStyle = xlContinuous

        .Weight = xlThin

    End With

    With Selection.Borders(xlInsideVertical)

        .LineStyle = xlContinuous

        .Weight = xlThin

    End With

    With Selection.Borders(xlInsideHorizontal)

        .LineStyle = xlContinuous

        .Weight = xlThin

    End With

    Dim btn As Button

    Dim rng As Range

    With Worksheets("Sheet1")

        Set rng = .Range("A" & Counter + 2)

        Set btn = .Buttons.Add(rng.Left, rng.Top, rng.Width, rng.Height)

    With btn

        .Caption = "Click this button to begin calculations"

        .AutoSize = True

    End With

    End With

End Sub



Option Explicit

Dim IntermediateVariable As Long

Public Counter As Long

Sub FindCFLGuess()

IntermediateVariable = Worksheets("Sheet1").Range("B:B").Cells.SpecialCells(xlCellTypeConstants).Count

Counter = IntermediateVariable - 1

End Sub

为什么 Counter 的值不能延续到第二个子例程?现在我有一个解决方法来计算 B 列中填写的单元格数量,这给了我数字。但是,这使得我无法将 B 列中的任何空间用于我想要使用的工作表的其余部分。

任何人都可以帮忙吗?我认为“公共”会使其成为工作簿级别的变量?每当我让第二个子显示 Counter 的值时,它就会显示为零。

抱歉,如果我的代码混乱/效率低下。我还在学习。:)

4

2 回答 2

5

在您的代码中,您声明Public Counter As Long了两次。可能发生的情况是您的每个Sub块都获得了不同的Counter变量。如果您删除第二个,它们应该共享相同的变量。

此外,您应该只需要为Option Explicit每个模块列出一次。其中,现在我看到您指定这些是单独的模块,您做得很好。

编辑:试图阐明更多。

将其视为分层,每个“范围”都是该层可以访问的。每一层都可以访问自己和所有父级。这是一个简化的可视化:

( program 
    ( module
        ( sub )
    )
)

在您的子例程中,您引用变量,因此程序开始向上查找。当然,假设您已经设置Option Explicit了这意味着必须手动定义变量,并且永远不会自动定义它们。

你想要的是如下的东西。变量在范围内是全局的,以便可以从同时运行的其他模块访问它。

( program
    [global variable]
    ( module1
        ( sub )
    )
    ( module2 )
)
于 2012-07-06T18:45:18.167 回答
0

我删除了您在生产中可能需要的一堆无关代码,但只是妨碍了查看问题。我测试了以下内容,并且 Counter 将其在第一个模块中的第一个 sub 中设置的值保持为第二个模块中的 sub。

模块一:

Option Explicit

    Public Counter As Long

    Sub TableCreation1()
        Dim btn As Button
        Dim rng As Range

        Counter = InputBox("How many pairs of data do you have? ")
        Range("A1") = "Time (days)"
        Range("B1") = "CFL (measured)"
        Range("A1:B1").Font.Bold = True
        Columns("A:B").EntireColumn.EntireColumn.AutoFit
        Range("A1").Select
        ActiveCell.Range("A1:B" & Counter + 1).Select

        With Worksheets("Sheet1")
            Set rng = .Range("A" & Counter + 2)
            Set btn = .Buttons.Add(rng.Left, rng.Top, rng.Width, rng.Height)
            With btn
                .Caption = "Click this button to begin calculations"
                .AutoSize = True
            End With
        End With
    End Sub

模块 2:

Option Explicit

Sub FindCFLGuess()
    MsgBox ("Counter = " & Counter)
End Sub

如果您创建一个包含 2 个模块的新工作簿并将代码粘贴到每个模块中,则您的 Counter 变量的值将显示在messageboxif you runTableCreation1然后FindCFLGuess按顺序显示。

如果由于某种原因出现运行时错误,或者中断代码的执行,显然 Counter 将失去其价值。如果这些事情都没有发生,您应该在单步执行代码时添加一个监视来跟踪变量的值。

要添加监视,请右键单击变量,选择添加监视...,然后从模块下拉列表中选择(所有模块) 。当表达式的值发生变化时,您还可以让手表中断。

于 2012-07-06T20:11:25.537 回答