(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个按钮。
每个按钮本质上都会添加自己的列(“维度”),无论显示什么,都将是所有这些的横截面。因此,重要的是要随时知道按下了哪些按钮。
此解决方案基于具有3个activeX切换按钮(均具有默认名称)的新工作表。
我首先将单元格绑定到每个切换按钮-A1
至ToggleButton1
,B1
至ToggleButton2
和C1
至ToggleButton3
。这会根据TRUE
的状态将FALSE
或ToggleButton
返回到单元格。
注:一眼单击一下就不容易了,因此可以在ToggleButton_Click
事件中更改按钮的背景色。 做Google如果您需要有关如何操作的帮助(有关如何执行操作的结果,大约有十亿个结果)。 我首先根据第一行值动态定义最后一列。
注:
我为SourceLastCol
包含2条语句-根据工作表的设置使用一个或另一个-如果保留原样,它将使用第二条语句中的值。 使用找到的最后一列,然后循环从A列到最后一列的第1行范围内的每个单元格。 如果值为True,则使用TempArray
将各列值吐出到我们的目的地(S列)中。
[最好有一个Submit
命令按钮来触发该子控件,而不是每次单击一个切换按钮时都运行它(好像您有30个,并且有人对其进行了更改,这是很多多余的工作表更改)。
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