获取在工具栏上按下按钮的文件的名称



我有一个宏在个人。格式化当前工作表的XLSB文件。这个宏有两种用法

  1. 从任何打开的文件
  2. 按下工具栏上的按钮
  3. 从另一个子/过程
  4. 调用

我试图写宏,不使用SELECT, ACTIVATE, PASTE等(因此,通过声明所有工作簿和工作表并使用WITH…)。要做到这一点,我必须知道调用宏的文件的名称,并且它必须能够从按钮和过程中调用。

下面的代码没有完全发挥作用,因为它没有在两个工作簿之间切换。我没有完成编码,因为我意识到我不知道如何获得文件和工作表的名称。

Option Explicit
Public Sub FormatTheBasics()
Dim CurLastColumn As Long, CurLastRow As Long

Dim CurRowNum As Long, LastRow As Long, FirstRowOfSection As Long, LastRowOfSection As Long
Dim CurCell As Variant, CurRange As Range
Dim wbkM  As Workbook, wbkC  As Workbook
Dim wksReplaceWords As Worksheet, wksFilesToExportEMail  As Worksheet, wksCopyFrom   As Worksheet, wksCopyTo   As Worksheet
Dim rngCopyFrom As Range, rngCopyTo As Range
Dim x     As Long
Dim CurColumnLetter As String, CurColumnName As String, ReplaceFrom As String, ReplaceTo As String
Application.EnableCancelKey = xlDisabled

Set wbkM = Workbooks("Personal.xlsb")
Set wksReplaceWords = wbkM.Sheets("ReplaceWords")

Cells.Select
With Selection.Font
.Name = "Calibri"
.Size = 11
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = 1
.TintAndShade = 0
.ThemeFont = xlThemeFontMinor
End With

Range("A1:" & MyColumnLetter(xlLastCol) & "1").Select

Selection.Font.Bold = True

With Selection.Interior
.PatternColorIndex = 2
.ThemeColor = xlThemeColorDark1
.TintAndShade = -0.149998474074526
.PatternTintAndShade = 0
End With

Selection.AutoFilter

Rows("2:2").Select
ActiveWindow.FreezePanes = True


For x = 1 To xlLastCol

CurColumnLetter = MyColumnLetter(x)
CurColumnName = StrConv(Range(CurColumnLetter & "1").Value, vbLowerCase)
Range(CurColumnLetter & "1").Value = StrConv(CurColumnName, vbProperCase)

CurRowNum = 2

With wksReplaceWords
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
Set CurRange = .Range("C" & CurRowNum & ":C" & LastRow)
For Each CurCell In CurRange
If CurCell <> "" Then

ReplaceFrom = .Range("B" & CurRowNum).Value
ReplaceTo = CurCell

If InStr(1, CurColumnName, ReplaceFrom, vbTextCompare) > 0 Then
Range(CurColumnLetter & "1").Replace what:=ReplaceFrom, replacement:=ReplaceTo, MatchCase:=True
End If

End If
Next CurCell
End With

Next x

Cells.Select
Cells.EntireColumn.AutoFit
Columns("A:" & MyColumnLetter(xlLastCol)).Sort key1:=Range("A2"), order1:=xlAscending, Header:=xlYes
Range("A2").Select
End Sub

在VBA函数中,没有办法找出在哪里以及为什么开始执行。用程序员的话来说,没有办法内省调用堆栈和执行上下文。

那么如何解决这个呢?您最好的选择是使用ActiveSheetActiveWorkbook一次仅当函数被触发时,假设目标工作簿的窗口在前面。将它存储到一个变量中,然后使用变量:

Public Sub DoStuff():
Dim ws as Worksheet
Set ws = ActiveSheet
ws.Range("A1").value = "Hello World"
' ...
End Sub

这样,如果你发现你的页检测逻辑有缺陷,你只需要在最上面改进代码。

工具栏不是特定于工作簿。这意味着工具栏不在XLS文件中。您可以通过代码添加它。但所有的excel表格都是这样。
以编程方式将外接程序宏添加到快速访问工具栏

activesheet给出了调用宏的游标所在的工作表。因此,一个工作表具有共同的宏。另一个叫它。一旦将宏附加到工具栏上,就不需要打开宏工作表。

激活,选择,粘贴是坏的,因为你正在寻求帮助的问题。宏可能正在运行。然后将光标移动到另一个工作表,宏将拾取新工作表。因此,良好的做法是在宏的开始处获取工作表(活动),并将其用于其余部分。使用工具栏宏将调用关闭的工作表的宏并使用活动的工作表引用。困难的部分是使用宏来更新非活动工作表,而不需要硬编码文件名。

在按钮附加过程中包含

strFileFullName = ThisWorkbook.FullName

获取所需的活动工作簿文件名