我正在尝试使用通过按钮调用的宏。我遵循这个答案,有人想做同样的事情:https://stackoverflow.com/a/52882368/20824840
但是我在运行它时遇到错误(法语: 在此输入图片描述 它将翻译为: “无法运行宏 'compilateur.xlsm!'Browse 6, 3''。该宏可能在此工作簿中不可用,或者所有宏都已停用/禁用”
我所做的如下: 右键单击图片-->分配宏-->手动写入宏的名称并添加参数: 在此输入图片描述
这是代码:
Public Sub Browse(ByVal row As Integer, ByVal column As Integer) ' Procédure parcourir
' Décalartion des workbooks et worksheets
Dim wb As Workbook: Set wb = ThisWorkbook
Dim ws As Worksheet: Set ws = wb.Worksheets(1)
' Déclaration de la variable contenant l'objet FileDialog (nécessaire pour ouvrir un fenêtre)
Dim DialogBox As FileDialog
Set DialogBox = Application.FileDialog(msoFileDialogOpen)
Dim InputFileName As String: InputFileName = "erreur"
' Ajout des paramètres de séléction
DialogBox.AllowMultiSelect = False
DialogBox.Title = "Séléctionnez un fichier"
DialogBox.InitialFileName = Application.ThisWorkbook.path
DialogBox.Filters.Clear
' Ajout de filtres d'extension en fonction du type de fichier
Dim vp As Boolean: vp = False
Select Case row
Case 6 To 8, 13 To 15, 20 To 22, 27 To 29
DialogBox.Filters.Add "Composant", "*.xlsx; *.xlsm; *.xml", 1
Case 9, 16, 23, 30
DialogBox.Filters.Add "Fichier", "*.xlsx; *.xlsm", 1: vp = True
Case Else
MsgBox "Erreur"
GoTo Endsub
End Select
' Ouverture de la fenêtre et écriture du chemin
If DialogBox.Show = -1 Then
InputFileName = DialogBox.SelectedItems(1)
ws.Cells(row, column).Value = InputFileName
End If
If vp Then
SplittedInputFileName = Split(InputFileName, "\")
Dim ExactNamefile As String: ExactNamefile = Split(SplittedInputFileName(UBound(SplittedInputFileName)), ".")(0)
ws.Cells(row + 1, column).Value = ExactNamefile & ".xml"
End If
Endsub:
End Sub
基本上,它是一个打开一个窗口的代码,我可以从中选择一个文件,并在单元格中输入完整路径以及应在按钮中输入的参数行和列: 在此输入图片描述
我尝试用另一种方法运行代码,使用以下代码:
Private Sub TestBrowse()
Browse 9, 3
End Sub
并且运行得非常好
我还尝试手动分配 TestBrowse 方法(这是私有的),如下所示:在此处输入图像描述 而且效果也很好。
还有一件事是我使用两个独立的模块,彼此不交互。
现在我明白你的问题了:你的宏名称与你的模块名称相同。 如果你真的想这样做,那么你必须这样调用你的宏:
compilateur.xlsm!'Browse.Browse 6, 3'
替代方法是使用不同的名称。
出现此行为的原因是 Excel 将模块排列在宏之上。 因此,如果有一个名为“浏览”的模块,并且您不采取任何措施来限定它,那么 Excel 会假定您正在引用该模块。 调用 Browse.Browse 表示,在名为 Browse 的模块中调用名为 Browse 的宏。
只要不会混淆,模块名称可以省略。