Excel-如何在整个工作簿范围内记住按钮的点击状态? (例如,显示隐藏数据或与另一个按钮的状态合并)

问题描述 投票:0回答:2

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

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

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

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

Private Sub Button_Click()

Worksheets("myworksheet.xlsx").Columns("E").Copy Destination:=Sheets(1).Columns("S")

End Sub

我想在会话持续时间内全局存储某些值,因此如果按下另一个按钮,它也可以获取此按钮的状态(以便连接两个按钮所引用的数据)。

存储这些值并检索它们的最佳方法是什么?

PS,这是我对Excel vba的首次尝试。主要目标是最小的开销,但仍然可以扩展到更多逻辑。因此,任何适用于20种参数的丑陋但快速的解决方案,对我来说也都很好……“上市时间”至关重要。

非常感谢您的时间和帮助。


用例:

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

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

按钮2的标签为“ CORE Database”。如果单独按下,它将在数据库表的“表”列中显示所有值,而在另一列中显示值“ CORE”。

如果同时按下两个按钮,则我要显示域A中的所有作业,并将“ CORE数据库”中的所有表作为目标。

然后,如果再次按下按钮“核心数据库”,即“切换为关闭”,则显示应返回到仅显示域A的所有作业。

现在如果按下第三个标记为“ VIEW Layer”的按钮,则将显示域A中所有作业的所有视图的组合。

然后将所有三个按钮组合在一起将显示所有三个按钮的组合。

此背后的逻辑可以在很多方面实现,我将看到我能走多远。起点是要有一个适当的位置来存储这些状态,如果情况变得非常复杂,则可能最多有30个按钮。

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

excel vba buttonclick
2个回答
1
投票

此解决方案基于具有3个activeX切换按钮(均具有默认名称)的新工作表。

我首先将单元格绑定到每个切换按钮-A1ToggleButton1B1ToggleButton2C1ToggleButton3。这会根据TRUE的状态将FALSEToggleButton返回到单元格。

对于视觉效果(单击切换按钮1和3):Example source data

注:一眼单击一下就不容易了,因此可以在ToggleButton_Click事件中更改按钮的背景色。 做Google如果您需要有关如何操作的帮助(有关如何执行操作的结果,大约有十亿个结果)。 我首先根据第一行值动态定义最后一列。

注:

我为SourceLastCol包含2条语句-根据工作表的设置使用一个或另一个-如果保留原样,它将使用第二条语句中的值。 使用找到的最后一列,然后循环从A列到最后一列的第1行范围内的每个单元格。

如果值为True,则使用TempArray将各列值吐出到我们的目的地(S列)中。

[最好有一个Submit命令按钮来触发该子控件,而不是每次单击一个切换按钮时都运行它(好像您有30个,并且有人对其进行了更改,这是很多多余的工作表更改)。

基于以上示例的输出:Output based on previous image example

Sub CheckToggleAndDisplayData() 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 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 For Each CellToCheck In SourceRange If CellToCheck.Value = True Then With Sheet1 SourceLastRow = .Cells(Rows.Count, CellToCheck.Column).End(xlUp).Row Set TrueRange = .Range(.Cells(CellToCheck.Row, CellToCheck.Column).Offset(1, 0), .Cells(SourceLastRow, CellToCheck.Column)) DestinationLastRow = .Cells(Rows.Count, "S").End(xlUp).Row Set DestinationRange = .Range("S" & DestinationLastRow + 1) TempArray = TrueRange DestinationRange.Resize(UBound(TempArray, 1), 1).Value = TempArray End With End If Next CellToCheck End Sub


0
投票
-编辑:我在塞缪尔(Samuel)的回答之前写了这个,所以显然这使它变得无关紧要:)目前,我将只采用以下解决方案,它对我有用,现在美容并不那么重要
© www.soinside.com 2019 - 2024. All rights reserved.