excel 公共变量未传递到Worksheet_SelectionChange

qmelpv7a  于 2023-05-19  发布在  其他
关注(0)|答案(1)|浏览(119)

我将前言,我是一个新手在最好的VBA。我有一个Excel 2016电子表格,用作数据库。我声明了一个公共变量AllUpdated,用来定义电子表格中的数据是否是最新的。我有一个ActiveX标签,我想在数据未更新时显示,并在数据最新时消失。然而,无论用户输入看到什么,变量似乎都只是False,因为标签总是可见的。
我在打开工作簿时声明变量。系统会提示用户是否要刷新数据(数据链接到Access数据库)。如果他们选择Yes,则变量应该更改为True,如果No,则变量变为False

Public AllUpdated As Boolean

Sub Workbook_Open()
    cRefresh = MsgBox("Would you like to refresh your data?", vbYesNo, "Refresh")
    If cRefresh = vbYes Then
        Call sRefreshMaster
        AllUpdated = True
    Else
        AllUpdated = False
    End If           
End Sub

当用户在工作簿中选择一个单元格时,如果数据过期,则标签应该出现,如果数据是最新的,则标签应该消失。

'- Just some code I found online on how to show and hide items in a given spot
'- on the screen each time a new cell is selected
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim MyPicture As Object
    Dim MyTop As Double
    Dim MyLeft As Double
    Dim BottomRightCell As Range
    Set MyPicture = ActiveSheet.Shapes("OODWatermark")

    If AllUpdated Then
        '- if data is up to date, hide watermark
        With MyPicture
            .Visible = False
        End With
    Else
        '- if data is out of date, display watermark
        '-----------------------------------------------------------
        '- bottom right cell
        With ActiveWindow.VisibleRange
            r = .Rows.Count
            c = .Columns.Count
            Set BottomRightCell = .Cells(r, c)
        End With
        '------------------------------------------------------------
        '- position picture
        MyTop = BottomRightCell.Top - MyPicture.Height - 5
        MyLeft = BottomRightCell.Left - MyPicture.Width - 5
        With MyPicture
            .Visible = True
            .Top = MyTop
            .Left = MyLeft
        End With
    End If
End Sub

如果我手动将标签更改为Visible = False,标签将消失,直到我单击新单元格,然后标签将重新出现。我该怎么解决这个问题?我想我错过了一些非常明显的东西,但我似乎在网上找不到答案。

ubbxdtey

ubbxdtey1#

如果你想使用一个公共变量,最好在一个通用模块中声明。当然,你也可以像以前一样,在工作表或工作簿模块中声明一个公共变量,但是你必须显式地引用它。
在上面的例子中,你需要使用ThisWorkbook.AllUpdated
VBA Best Practise Link 1
VBA Best Practise Link 2
但是,像往常一样,要小心,因为作为一个例子,* 用数据类型指示符作为变量的前缀...* 不再被认为是一个好的做法,至少我认为这是错误的。糟糕的做法。

相关问题