2015-08-06 2 views
1

Я сделал макрос, который обрабатывает несколько файлов в каталоге и генерирует CSV-файлы, чтобы взять их в базу данных.Excel Выполнить макрос из кнопки проблема

Когда я запускаю макрос из меню «Макросы» или «шаг за шагом», у меня нет проблем. он Gos через все файлы и все строки (в файлах).

Но когда я назначаю макрос кнопке, он просматривает все файлы, но не работает в некоторых строках. И результат в CSV отличается.

Работы

enter image description here

не работает

enter image description here

ХОРОШО 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: Извините за мой английский.

EDIT Я установил кнопку на другой макрос, чтобы запустить другой, но результат тот же. Начальный лист, это не имеет значения. (Не проверено) КОД: (NO РЕДАКТИРОВАТЬ)

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 
+0

Похоже, что-то не так с вашим кодом, но если вы разместите его мы не можем делать какие-либо предложения относительно того, что проблема может быть ... –

+0

Очевидно, я подумал, что, но зачем работать, если запустить не от кнопки. Кнопка запускает макрос, или нет? код очень обширный, вот почему я не публикую. – Blaztix

+0

Что-то вы можете попробовать, так как мы не можем видеть код :) - это сделать еще один макрос, который вызывает первый. Затем установите кнопку для запуска этого макроса. Я знаю, что похоже, что он ничего не должен делать, кроме как у VBA может быть что-то странное. –

ответ

1

Существует только один путь, который не может работать. То есть неправильное место вашего метода.

Необходимо знать, что вы используете Active X control. Таким образом, метод click для этой кнопки должен содержать внутри модуля листа. Я имею в виду, вы положили свою кнопку в Sheet1, вам также нужно поместить методы мероприятия этой кнопки в Модуль Sheet1.

А также имя метода должно быть Закрытая кнопка_Name_Click(). В этом случае buttonName не должно быть ярлык кнопки (например, в вашем «ProcesarTodo»). Это должно быть как «CommandButton1». Вы также можете изменить это имя в теге свойств редактора VBA.Если вы измените имя, имя метода должно быть Private Sub ProcesarTodo_Click().

Итак, проверьте свой код и модуль еще раз. Вы скрываете имена модуля в своих доказательствах, поэтому я могу сказать подсказку. Если вы четко покажетесь, я могу точно сказать.

Если вы не знаете, как это сделать, просто следующие шаги:

  1. Щелкните правой кнопкой мыши на кнопке.
  2. Из списка выберите «Просмотреть код».
  3. Итак, вы можете увидеть правильный метод для своей кнопки, скопировать и вставить все тело метода из старого в новое.
  4. И затем, проверьте об этом. Он будет работать отлично.
+0

Я делаю это « Private Sub CommandButton1_Click() Вызов ProcesarTodo End Sub« Active X control - это решение – Blaztix

+0

Рад помочь вам ..! –

Смежные вопросы