为生成窗体控件按钮的宏设置按钮位置

Setting Button Location for Macro that Generates Form Control Buttons

提问人:BiGXERO 提问时间:5/9/2012 最后编辑:pnutsBiGXERO 更新时间:11/12/2016 访问量:8403

问:

我目前有数据,我正在将数据拆分为多个工作表,并允许用户选择他们在哪个工作表上运行宏。工作表用作多个系统之间的过滤

我有一个命名范围(dayList),它将数据分组为天,并为每天(day1、day2 等)创建一个新工作表。然后,每个工作表必须应用另一个宏(屏幕数据),该宏将以完全相同的方式过滤每个工作表中的数据。

我正在尝试创建一个 UI,该 UI 将近似于用户能够单击命名范围内的单元格之一以运行该特定日期的宏。我当前使用的代码片段如下。

 Sheets("LaunchScreen").Activate
    Cells(rowCounter, 6).Value = "Day" & dayCounter
    ActiveSheet.Buttons.Add(538.5, 56.25, 48.75, 13.5).Name = "Day" & dayCounter
    ActiveSheet.Buttons("Day" & dayCounter).Select
    Selection.OnAction = "JoinTransactionAndFMMS"

我循环此以每天创建一个新按钮,然后将按钮名称作为参数传递给另一个宏,以在此工作簿中查找具有相同名称的工作表。

TLDR:我需要:

  1. 使用 VBA 设置按钮的位置,最好将位置与单元格引用匹配,例如 Range("A1").Button.Insert
  2. 将单元格引用从命名区域传递到宏中

一个优秀的菜鸟在这里超越了他的头顶。任何帮助将不胜感激!

VBA Excel-2007

评论


答:

2赞 Jerry Beaucaire 5/9/2012 #1

1) .Add 方法需要 4 个参数。前两个是 TOP 和 LEFT 位置,用于获取按钮的左上角,第 3 个和第 4 个是按钮的高度和宽度设置。

因此,如果您知道要添加一个按钮,并且引用是将其放置在单元格 C10(比 A1 更好的示例),那么这将这样做:

ActiveSheet.Buttons.Add(Range("C10").Top, Range("C10").Left, 48.75, 13.5).Name = "Day" & dayCounter     

2) 你的宏必须首先设计为接受“传递”到其中的参数。所以,像这样的东西

Sub MyMacro(MyRange As Range)
    MsgBox MyRange.Address
End Sub

现在,您的其他宏可以调用 MyMacro,您必须在调用参数时传入该参数:

Sub test2()
   Call MyMacro(Range("Animals"))
End Sub

评论

0赞 Siddharth Rout 5/9/2012
+ 1 解释得很好:)我想你之前有一个额外的“=”符号"Day" & dayCounter
1赞 BiGXERO 5/10/2012
你的公式肯定让我朝着正确的方向前进,但是,按钮不会去他们应该去的地方。例如:<code> ActiveSheet.Buttons.Add(Range(“B1”)。Top, Range(“A1”)。左,48.75,13.5)。Text = “B1” </code> 会在屏幕的左上角放置一个按钮 (A1) 和:<code>ActiveSheet.Buttons.Add(Range(“C5”)。Top, Range(“C5”)。左,48.75,13.5)。Text = “C5” </code>将按钮放在第 7 行和第 8 行之间的中间位置,以及 B 列和 c 列之间的中间左侧。尽管传递参数位就像一个魅力。
1赞 Jerry Beaucaire 5/10/2012
需要明确的是,[B1]。Top 表示“屏幕顶部”和 [A1]。Left 的意思是“屏幕的左侧”,因此它们一起会导致屏幕的 TOP/LEFT,相当于 A1。
0赞 BiGXERO 5/15/2012
这是有道理的。使用您的代码作为基础,我现在调整了我的原始计划,以使用用户窗体,而不是尝试将控件直接添加到工作表中。由于范围的变化,我开始了另一个问题。如果您有任何建议,将不胜感激。感谢您到目前为止的帮助。[链接]stackoverflow.com/questions/10592641/......