【问题标题】:Get name of the file from which the button was pressed on the toolbar获取在工具栏上按下按钮的文件的名称
【发布时间】:2021-05-17 05:16:33
【问题描述】:

personal.xlsb 文件中有一个宏来格式化当前工作表。该宏有两种使用方式

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

我正在尝试编写宏,而不使用 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

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    在 VBA 函数中,无法找出执行开始的位置和原因。用程序员的话说,没有办法内省调用堆栈和执行上下文。

    那么如何解决呢?最好的办法是只使用ActiveSheetActiveWorkbook 一次,假设触发该功能时目标工作簿的窗口在前面。将其存储到变量中,然后使用变量:

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

    这样,如果您在工作表检测逻辑中发现缺陷,您只需要改进顶部的代码即可。

    【讨论】:

      【解决方案2】:

      工具栏不是特定于工作簿的。表示工具栏不在 xls 文件中。您可以通过代码添加它。但它会保留在所有 excel 表格中。
      Programmatically Add Add-In Macro to Quick Access Toolbar

      Activeshheet 提供光标所在的调用宏的工作表。所以一张纸有共同的宏。另一个叫它。将宏附加到工具栏后,无需打开宏表。

      由于您寻求帮助的问题,活动、选择、粘贴很糟糕。可以运行宏。然后将光标移动到另一个工作表,宏将拾取新工作表。所以好的做法是在宏的开头抓取工作表(活动),然后将其用于其余部分。 使用工具栏宏将调用已关闭工作表的宏并使用活动工作表引用。困难的部分是使用宏来更新非活动工作表,而不用硬编码文件名。

      【讨论】:

      • 抱歉工具栏可以通过代码编辑。它是 XLSB 文件中的 customXML。解压excel文件以找到它们。可以使用 vba 代码修改内部文件。很多工作。 bettersolutions.com/vba/ribbon/…。洞察力。某处可能有一个 excel 样式/宏文件
      • 嘿,谢谢!!但我的问题不仅仅是从工具栏中单击。当我从另一个过程调用该宏时,我遇到了同样的问题。我认为上面的答案解释了为什么会这样。
      【解决方案3】:

      在按钮上附加程序包括

      strFileFullName = ThisWorkbook.FullName
      

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

      【讨论】:

      • 这给出了personal.xlsb
      • 是你点击按钮的那个文件
      • 不,这就是问题所在:)下面已经有人回答了。不先激活就没有办法得到它
      猜你喜欢
      • 1970-01-01
      • 2021-04-25
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多