Excel-如何记忆工作簿范围内按钮的单击状态?(例如,显示隐藏数据或使用另一个按钮的状态连接)
(TLDR:问题是直到“用例:”) 当第二次按下按钮时,我试图删除excel列中的值 在这个阶段,我有一个带有以下代码的按钮,如果按下该按钮,它将显示另一张表中的值。数据仅显示在当前工作表中,它永远不会超过许多列,比如最多10列,并且它们将根据按钮状态进行复制/删除 (通过开发人员工具实现为ActiveX按钮): 我希望在会话期间全局存储某些值,这样,如果按下另一个按钮,它也可以获取此按钮的状态(以便将两个按钮引用的数据连接起来) 存储和检索这些值的最佳方法是什么 PS这是我第一次尝试Excel vba。主要目标是最小化开销,但仍然可以扩展到更多逻辑。所以,任何丑陋但快速的解决方案,比如说20个参数,对我来说也是不错的。。。“上市时间”至关重要 非常感谢您的时间和帮助Excel-如何记忆工作簿范围内按钮的单击状态?(例如,显示隐藏数据或使用另一个按钮的状态连接),excel,vba,buttonclick,Excel,Vba,Buttonclick,(TLDR:问题是直到“用例:”) 当第二次按下按钮时,我试图删除excel列中的值 在这个阶段,我有一个带有以下代码的按钮,如果按下该按钮,它将显示另一张表中的值。数据仅显示在当前工作表中,它永远不会超过许多列,比如最多10列,并且它们将根据按钮状态进行复制/删除 (通过开发人员工具实现为ActiveX按钮): 我希望在会话期间全局存储某些值,这样,如果按下另一个按钮,它也可以获取此按钮的状态(以便将两个按钮引用的数据连接起来) 存储和检索这些值的最佳方法是什么 PS这是我第一次尝试Excel
用例: 显示数据加载过程中从输入文件到报告域的所有相关表或对象,但仅显示按下相关按钮的对象。例如,在域“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