Excel-如何记忆工作簿范围内按钮的单击状态?(例如,显示隐藏数据或使用另一个按钮的状态连接)

Excel-如何记忆工作簿范围内按钮的单击状态?(例如,显示隐藏数据或使用另一个按钮的状态连接),excel,vba,buttonclick,Excel,Vba,Buttonclick,(TLDR:问题是直到“用例:”) 当第二次按下按钮时,我试图删除excel列中的值 在这个阶段,我有一个带有以下代码的按钮,如果按下该按钮,它将显示另一张表中的值。数据仅显示在当前工作表中,它永远不会超过许多列,比如最多10列,并且它们将根据按钮状态进行复制/删除 (通过开发人员工具实现为ActiveX按钮): 我希望在会话期间全局存储某些值,这样,如果按下另一个按钮,它也可以获取此按钮的状态(以便将两个按钮引用的数据连接起来) 存储和检索这些值的最佳方法是什么 PS这是我第一次尝试Excel

(TLDR:问题是直到“用例:”)

当第二次按下按钮时,我试图删除excel列中的值

在这个阶段,我有一个带有以下代码的按钮,如果按下该按钮,它将显示另一张表中的值。数据仅显示在当前工作表中,它永远不会超过许多列,比如最多10列,并且它们将根据按钮状态进行复制/删除

(通过开发人员工具实现为ActiveX按钮):

我希望在会话期间全局存储某些值,这样,如果按下另一个按钮,它也可以获取此按钮的状态(以便将两个按钮引用的数据连接起来)

存储和检索这些值的最佳方法是什么

PS这是我第一次尝试Excel vba。主要目标是最小化开销,但仍然可以扩展到更多逻辑。所以,任何丑陋但快速的解决方案,比如说20个参数,对我来说也是不错的。。。“上市时间”至关重要

非常感谢您的时间和帮助


用例:

显示数据加载过程中从输入文件到报告域的所有相关表或对象,但仅显示按下相关按钮的对象。例如,在域“A”中显示所有目标表,或在源提要“X”中显示使用源文件的所有报告

按钮1有标签“域A”。如果按下,它将获得另一个工作表中“域A”列中列出的所有作业并显示它们

按钮2有标签“核心数据库”。如果自己按下,它将显示数据库工作表中“tables”列的所有值,这些值在另一列中具有“CORE”值

如果两个按钮都按下,我想显示域A中的所有作业,以及它们作为目标的“核心数据库”中的所有表

然后,如果再次按下“CORE Database”(核心数据库)按钮,即“关闭”,显示屏应返回到仅显示域A的所有作业

现在,如果按下第三个按钮,标记为“视图层”,则域a中所有作业的所有视图的组合应该显示出来

组合所有三个按钮应显示所有三个按钮的组合

我想,这背后的逻辑可以在许多方面得到实现,我将看看我能走多远。首先要有一个合适的位置来存储这些状态,如果事情变得非常疯狂,可能会有多达30个按钮

每个按钮本质上都添加了自己的列(“维度”),无论显示什么,都将是所有这些内容的一个横截面。因此,随时知道按下了哪些按钮是很重要的

更新2:
数据中的一些示例(警告,这超出了原始问题):
作业表包含作业及其表格。
“视图”工作表保存视图及其源表

如果仅选择了“作业”按钮,则显示:
源数据:作业,重复数据消除

如果只按了“查看”按钮,则显示数据库中已消除重复的所有视图。
例如:

如果仅选择了“CORE”按钮,则显示CORE数据库中的所有表,例如: 关联数据:表格,取自作业表和视图表,已消除重复 (编辑:这是不一致的,因为表格X和Y不知从何处出现,它们可能被忽略或显示更多作业)

如果按下“作业和核心”按钮,则显示(这直接来自作业表):
源数据:作业及其目标表

如果按下“表格和视图”按钮:
(在本例中,视图B不是由任何作业交付的)
源数据:视图及其源表

(因此ViewA使用两个表作为源)

如果按下“作业”和“查看”按钮:
联接数据:视图和相关作业,通过其匹配表联接

最后,如果按下这三个按钮,实际上会显示更多的列,显示更多的行,因为重复数据消除较少:
关联数据:视图和相关作业,通过其匹配表关联,显示所有

(尽管名称“B”令人困惑,但jobB并没有加载ViewB。回想起来,应该选择不同的名称)

-edit:我在Samuel的回答之前写了这篇文章,因此这显然与此无关:)
现在我只想用下面的解决方案,它对我来说很有效,现在美并不那么重要

-更新:我现在使用全局变量,当然我的程序员Mind告诉我这是危险的,但我现在只需要结果,它们只是状态的布尔值。任何建议都是非常受欢迎的。 以下是我现在掌握的一些代码:

Public CORE_Pressed As Boolean

Sub clearCol(colLabel As String)
  Columns(colLabel).ClearFormats
  Columns(colLabel).ClearComments
  Columns(colLabel).ClearHyperlinks
  Columns(colLabel).Clear
End Sub

Private Sub Workbook_Open()
  SLJM_Pressed = False

End Sub      

Private Sub CORE_Button_Click()
CORE_Pressed = Not CORE_Pressed
If CORE_Pressed = True Then
  Worksheets("CORE.xlsx").Columns("E").Copy Destination:=Sheets(1).Columns("S")
Else
  clearCol ("S")
End If

End Sub
我可能会将按钮处理移到一个中心函数中,但这只是为了显示当前的方法


同样非常感谢塞缪尔·埃弗森(Samuel Everson)发表的评论,当事情需要更加“专业”时,他们给出了一个非常有趣的选择。我知道全局变量很难看。

此解决方案基于一个新的工作表,该工作表具有3个activeX切换按钮(所有按钮都具有默认名称)

我首先将一个单元格绑定到每个切换按钮-
A1
ToggleButton1
B1
ToggleButton2
C1
ToggleButton3
。这会根据
切换按钮的状态将
TRUE
FALSE
返回到单元格

对于视觉效果,以下是源数据:

注意:由于不容易一眼就能看到哪些按钮被点击,您可以在
ToggleButton\u Click
事件中更改按钮的背景颜色。
像这样:

With Sheet1.ToggleButton1
    If .Value = True Then
        .BackColor = &HFF00&
    ElseIf .Value = False Then
        .BackColor = &H8000000F
    End If
End With
End Sub

Private Sub ToggleButton2_Click()
With Sheet1.ToggleButton2
    If .Value = True Then
        .BackColor = &HFF00&
    ElseIf .Value = False Then
        .BackColor = &H8000000F
    End If
End With
End Sub

Private Sub ToggleButton3_Click()
With Sheet1.ToggleButton3
    If .Value = True Then
        .BackColor = &HFF00&
    ElseIf .Value = False Then
        .BackColor = &H8000000F
    End If
End With
End Sub

我首先根据第一行值动态定义最后一列。

注意:我为
SourceLastCol
包含了两条语句-使用一条或另一条语句
With Sheet1.ToggleButton1
    If .Value = True Then
        .BackColor = &HFF00&
    ElseIf .Value = False Then
        .BackColor = &H8000000F
    End If
End With
End Sub

Private Sub ToggleButton2_Click()
With Sheet1.ToggleButton2
    If .Value = True Then
        .BackColor = &HFF00&
    ElseIf .Value = False Then
        .BackColor = &H8000000F
    End If
End With
End Sub

Private Sub ToggleButton3_Click()
With Sheet1.ToggleButton3
    If .Value = True Then
        .BackColor = &HFF00&
    ElseIf .Value = False Then
        .BackColor = &H8000000F
    End If
End With
End Sub
Sub CheckToggleAndJoinData()

Dim SourceLastCol As Long
Dim SourceLastRow As Long
Dim SourceRange As Range
Dim CellToCheck As Range
Dim TrueRange As Range
Dim DestinationRange As Range
Dim DestinationLastRow As Long
Dim DestinationLastCol As Long
Dim TempArray As Variant

With Sheet1
    SourceLastRow = .Cells(Rows.Count, "S").End(xlUp).Row
    .Range("S1:S" & SourceLastRow).ClearContents
    SourceLastRow = 0

    SourceLastCol = Sheet1.Cells(1, Columns.Count).End(xlToLeft).Column 'Use this one if there is no data to the right of your source columns.
    SourceLastCol = Sheet1.Cells(1, 1).End(xlToRight).Column 'Use this if there is data to the right of your source columns (note this will not work if there are blank gaps in your source columns)

    Set SourceRange = .Range(.Cells(1, 1), .Cells(1, SourceLastCol))
End With

Dim TrueColumnArray As Variant
Dim ColumnToCheck As Long
Dim ColumnCounter As Long

ColumnCounter = 0
For ColumnToCheck = 1 To SourceLastCol
    With Sheet1
        If .Cells(1, ColumnToCheck).Value = True Then
            ColumnCounter = ColumnCounter + 1
            SourceLastRow = .Cells(Rows.Count, ColumnToCheck).End(xlUp).Row
            Set TrueRange = .Range(.Cells(2, ColumnToCheck), .Cells(SourceLastRow, ColumnToCheck))

            DestinationLastCol = Sheet2.Cells(1, Columns.Count).End(xlToLeft).Column
            If ColumnCounter = 1 Then
                Set DestinationRange = Sheet2.Cells(1, DestinationLastCol)
            Else
                 Set DestinationRange = Sheet2.Cells(1, DestinationLastCol + 1)
            End If

            TempArray = TrueRange
            DestinationRange.Resize(UBound(TempArray, 1), 1).Value = TempArray
        End If
    End With
Next ColumnToCheck

End Sub