【问题标题】:Excel Run macro from button issueExcel 从按钮问题运行宏
【发布时间】:2015-08-06 22:38:56
【问题描述】:

我制作了一个宏来处理目录中的多个文件并生成 CSV 文件以将它们作为数据库。

当我从宏菜单或“步入”运行宏时,我没有问题。它遍历所有文件和所有行(在文件中)。

但是当我将宏分配给一个按钮时,它会遍历所有文件但在某些行中失败并且 CSV 中的结果不同。

作品

无效

好的 CSV        :D

NAME , GROUP1, 25,13
NAME1, GROUP1, 25,17
NAME2, GROUP2, 27,14
NAME3, GROUP2, 28,16
NAME2, GROUP2, 23,12

错误的 CSV         D:

NAME , GROUP1, 25,13
NAME1, GROUP1, 25,17
, GROUP2, 27,14
, GROUP2, 23,12

更少的行和错误的格式

我认为它不应该成为宏的一部分,没有按钮它可以完美地工作,但我需要它。

我测试过

 Application.ScreenUpdating = False

 Application.ScreenUpdating = True

PD:对不起我的英语。

编辑 我将按钮设置为另一个宏,以运行另一个,但结果是一样的。 开始工作表,没关系。 (已测试) 编码: (无编辑)

Public Sub ProcesarTodo()

    Application.ScreenUpdating = False
    Dim Filename, Pathname As String
    Dim wb As Workbook

    Pathname = ActiveWorkbook.path & "\Inscripciones\"
    Exportpath = ActiveWorkbook.path & "\CSV\"
    ExportpathE = ActiveWorkbook.path & "\CSV_E\"
    Filename = Dir(Pathname & "*.xls")

    answer = MsgBox("Eliminar archivos de carpeta CSV?", vbYesNo + vbQuestion, "VACIAR CSV")
    If answer = vbYes Then
        On Error Resume Next
        Kill Exportpath & "*.csv"
        Kill ExportpathE & "*.csv"
        On Error GoTo 0
    End If

    a = 0
    rows = 0
    rowsE = 0
    Dim Data(1 To 1) As String
    Dim Hojas(1 To 2) As String
    Data(1) = "Z"
    Hojas(1) = "A"
    Hojas(2) = "B"
    etapa = 3

    Do While Filename <> ""
        Set wb = Workbooks.Open(Pathname & Filename)
        '   CREAR SI NO EXISTE HOJA PARA ATLETAS
        Dim mySheetName As String, mySheetNameTest As String
        mySheetName = "Procesar"
        On Error Resume Next
        mySheetNameTest = Worksheets(mySheetName).name
        If Err.Number = 0 Then
            Worksheets(mySheetName).Cells.Clear
        Else
            Err.Clear
            Worksheets.Add.name = mySheetName
        End If
        '   This function get data from the file's name.
        get_data
        n = 1
        For Each Hoja In Hojas
            Sheets(Hoja).Select
            For i = Cells(9, 7).Value To Cells(9, 9).Value Step 2
                For j = Cells(10, 3).Value To Cells(10, 5).Value
                    If Cells(j, i).Value = "T" Or Cells(j, i).Value = "t" Or Cells(j, i).Value = "R" Or Cells(j, i).Value = "r" Then
                        Sheets("Procesar").Cells(n, 1).Value = Sheets(Hoja).Cells(j, 2).Value
                        Sheets("Procesar").Cells(n, 2).Value = equipo                               
                        Sheets("Procesar").Cells(n, 3).Value = Sheets(Hoja).Cells(11, i).Value
                        Worksheets(Hoja).Cells(j, i + 1).copy                                       
                        Worksheets("Procesar").Cells(n, 4).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
            xlNone, SkipBlanks:=False, Transpose:=False                                             
                        Sheets("Procesar").Cells(n, 5).Value = Sheets(Hoja).Cells(j, i).Value
                        Sheets("Procesar").Cells(n, 6).Value = Sheets(Hoja).Cells(12, i).Value
                        n = n + 1
                    End If
                Next j
            Next i
        Next Hoja
        n = n - 1

        Sheets("Procesar").Select
        Range("H1").Select
        Let x = 1
        Do While x <= n
        ActiveCell.FormulaR1C1 = "=PROPER(RC[-7])"
        Selection.Offset(1, 0).Select
        x = x + 1
        Loop
        Range("H1:H" & n).Select
        Selection.copy
        Range("A1").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Range("H1:H" & n).Select
        Selection.ClearContents
        '   Exportar Atletas
        Call Exportar(Exportpath, wb.name, n)

        wb.Close SaveChanges:=False
        Filename = Dir()
        a = a + 1
    Loop ' Next file
    Application.ScreenUpdating = True
    bat
    mensaje = MsgBox("Se procesaron " & a & " archivos" & vbNewLine & "El cual son " & rows & " atletas" & vbNewLine & "Y " & rowsE & " Entrenadores." & vbNewLine & "Programa realizado por Tomas Prado", , "Listo")

End Sub

Function Exportar(path, name, n)
    equipo = Replace(name, ".xlsx", "")
    equipo2 = Replace(equipo, ".xls", "")
    Let Rango = "A1:" & "F" & n
    ActiveSheet.Range(Rango).Select
    Selection.copy
    Worksheets.Add.name = "Exportar"
    Range("A1").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    ' Formato antiguo xlCSV
    ActiveWorkbook.SaveAs Filename:= _
        path & equipo2 & ".csv", FileFormat:=xlCSV, _
        CreateBackup:=False
    rows = rows + n
End Function

【问题讨论】:

  • 听起来您的代码有问题,但除非您发布它,否则我们无法就问题所在提出任何建议......
  • 显然我已经想到了,但是如果不是从按钮运行,为什么还要工作。按钮只运行宏,还是不运行?代码非常广泛,这就是我不发布的原因。
  • 由于我们看不到代码,您可以尝试一下:) 是创建另一个调用第一个宏的宏。然后设置按钮以运行该宏。我知道它似乎不应该做任何事情,但 VBA 可能会发生一些奇怪的事情
  • 可能就像您的代码在启动时依赖于处于活动状态的某个工作表一样简单:如果按钮在不同的工作表上,那么该工作表将始终是活动工作表。
  • 用包含的工作表限定 所有 范围引用以及包含工作簿的所有工作表引用总是一个好主意。如果你这样做,你会发现你的代码运行得更加可靠。目前,代码中任何特定点发生的确切情况将取决于哪个工作簿处于活动状态,而且预测或依赖它并不总是那么容易。

标签: vba excel button


【解决方案1】:

只有一种方法行不通。那是你方法的错误之处

要知道的是,您正在使用 Active X 控件。因此,该按钮的点击方法必须在工作表的模块内。我的意思是,您将按钮放在 Sheet1 中,您还需要将该按钮的事件方法放在 Sheet1 的模块中。

而且方法名称必须是Private Sub buttonName_Click()。其中,buttonName 不应该是 button label(例如,在您的“ProcesarTodo”中)。它应该像“CommandButton1”。您还可以在 VBA 编辑器的属性标签中更改该名称。如果更改名称,则方法名称应为Private Sub ProcesarTodo_Click()

所以,再次检查您的代码和模块。您在证据中隐藏了模块的名称,所以,我可以暗示说。如果你显示清楚,我可以准确地说。

如果你不知道怎么办,只需按照以下步骤:

  1. 右键单击您的按钮。
  2. 从列表中选择“查看代码”。
  3. 因此,您可以查看按钮的正确方法,将旧方法体中的所有方法体复制并粘贴到新方法体。
  4. 然后,测试一下。它将完美运行。

【讨论】:

  • 我这样做“Private Sub CommandButton1_Click() Call ProcesarTodo End Sub”Active X 控件是解决方案
猜你喜欢
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多