簡體   English   中英

Excel Run宏從按鈕問題

[英]Excel Run macro from button issue

我制作了一個宏,該宏處理目錄中的多個文件,並生成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

只有一種方法行不通。 那是你方法的錯誤地方

要知道的一件事是您正在使用Active X控件 因此,該按鈕的click方法必須在工作表的模塊中 我的意思是,您將按鈕放在Sheet1中 ,還需要將該按鈕的事件方法放入Sheet1的模塊中

而且方法名稱也必須是Private Sub buttonName_Click() 那樣, buttonName不應是按鈕標簽 (例如,在“ ProcesarTodo”中)。 它應該像“ CommandButton1”。 您也可以在VBA編輯器的“屬性”標簽中更改該名稱。 如果更改名稱,則方法名稱應為Private Sub ProcesarTodo_Click()

因此,再次檢查您的代碼和模塊。 您將模塊名稱隱藏在證據中,因此,我可以暗示一下。 如果您顯示清楚,我可以准確地說。

如果您不知道如何操作,請按照以下步驟操作:

  1. 右鍵單擊您的按鈕。
  2. 從列表中選擇“查看代碼”。
  3. 因此,您可以看到適合您按鈕的方法,將所有方法主體從舊復制並粘貼到新的主體。
  4. 然后,對其進行測試。 它將完美運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM