Предложить пользователю открыть рабочую книгу и выбрать рабочую таблицу, открывает пустой файл - PullRequest
0 голосов
/ 07 февраля 2020

Я бы хотел, чтобы пользователь выбрал рабочую книгу, а затем выбрал нужный лист. Код работает отлично, когда это Debug - Step Into. Но, когда весь макрос запускается через кнопку, файл открывается и предлагает выбрать лист, но листы или ячейки не видны. Это все пустое. Нет защиты файла. Имена столбцов и номера строк не отображаются

 Sub LoadData()
     Dim ws As Worksheet
     Dim desiredSheetName As String
     Dim c As String

     Application.ScreenUpdating = False
     Application.DisplayAlerts = False

     ans = MsgBox("Choose the file to retrive the data?", vbYesNo, "Choose Source")
     If ans = vbYes Then
        myfile = Application.GetOpenFilename(, , "Browse for Workbook")
        If myfile <> False Then
           ThisWorkbook.Sheets("Destination").Range("AA2") = myfile
           Set src_data = Workbooks.Open(myfile)

          On Error Resume Next
          desiredSheetName = InputBox("Select any cell inside the target sheet: ",type:=8).worksheet.name 
          sht = desiredSheetName
          On Error GoTo 0

          Set dest = ThisWorkbook.Worksheets("Destination")

          src_data.Activate

          lastcell = src_data.Sheets(sht).Cells(Rows.Count, "C").End(xlUp).Row
          LastRowD = dest.Cells(dest.Rows.Count, "F").End(xlUp).Offset(0).Row

          src_data.Activate
          Sheets(sht).Select
          Range("A:B,D:D").Select
          Selection.Copy
          dest.Activate
          Range("F1").Select
          Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, skipblanks:=False, Transpose:=False

          src_data.Close False

          dest.Select

        End If
   Else
     Exit Sub
 End If

Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020

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

A несколько других указателей на ваш код:

  • Вы используете переменные, которые вы не объявили (sht, srcData).
  • Если вы используете переменную только один раз (например, ans из вашего MessageBox), просто подключите ее напрямую, вместо затемнения переменной и ее использования. Исключением будет использование константы, например числа. В этом случае всегда лучше использовать значимое имя переменной, чем жестко закодированное число без контекста.
  • Вы должны установить Option Explicit в верхней части вашего модуля, и вы будете предупреждены об этом с помощью необъявленных переменных.
  • Вы получаете destinationSheet и затем настраиваете sht на то же самое. Почему бы просто не избавиться от sht в целом?
  • Вместо того, чтобы смешивать соглашения об именах переменных (src_data и desiredSheetName), просто выберите один и придерживайтесь его (я сам использую последний формат).
  • Выбор и активация вещей - обычно неправильный способ сделать это, если вы не делаете это, чтобы пользователь мог видеть что-то определенное c. Обычно вы должны просто выполнять операции над диапазонами и самими листами. Кроме того, вы должны четко указать используемый лист (потому что в противном случае по умолчанию используется ActiveSheet). Например:

Вместо:

Range("A:B,D:D").Select
Selection.Copy
dest.Activate
Range("F1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, skipblanks:=False, Transpose:=False

Do:

src_data.Range("A:B,D:D").Copy
dest.Range("F1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, skipblanks:=False, Transpose:=False

Это очень ясно показывает, откуда вы копируете и куда вы ' Это означает, что количество строк кода меньше, а также быстрее обрабатывается.

Итак, вот последний код с четко определенными переменными, без листов Select, вырезанные неиспользуемые переменные .

Option Explicit
Sub LoadData()
     Dim sourcePath As String
     Dim sourceWorkbook As Workbook
     Dim sourceWorksheet As Worksheet
     Dim destinationWorksheet As Worksheet
     Dim lastSourceRow As Long
     Dim lastDestinationRow As Long

     'Application.ScreenUpdating = False '==>Moved after InputBox
     Application.DisplayAlerts = False
     Set destinationWorksheet = ThisWorkbook.Worksheets("Destination")

     If MsgBox("Choose the file to retrive the data?", vbYesNo, "Choose Source") = vbYes Then
        sourcePath = Application.GetOpenFilename(, , "Browse for Workbook")
        If sourcePath <> "False" Then
          destinationWorksheet.Range("A2") = sourcePath
          Set sourceWorkbook = Workbooks.Open(sourcePath)

          On Error Resume Next
          sourceWorksheet = Application.InputBox(prompt:="Select any cell inside the target sheet:", Type:=8).Worksheet
          On Error GoTo 0

          Application.ScreenUpdating = False

          lastSourceRow = sourceWorksheet.Cells(Rows.Count, "C").End(xlUp).Row
          lastDestinationRow = destinationWorksheet.Cells(destinationWorksheet.Rows.Count, "F").End(xlUp).Offset(0).Row

          sourceWorksheet.Range("A:B,D:D").Copy
          destinationWorksheet.Range("F1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, skipblanks:=False, Transpose:=False

          sourceWorkbook.Close False

          destinationWorksheet.Select

        End If
   Else
     Exit Sub
 End If

Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub
0 голосов
/ 07 февраля 2020

Когда myfile = False, вы выходите из сабвуфера с выключенным обновлением экрана. Вам либо нужно

  1. Убедитесь, что ваш код всегда выполняется от начала и до конца ИЛИ
  2. Включите приложения снова, прежде чем делать ранний выход.

If myfile <> False Then
    'Your code here
Else
    Application.ScreenUpdating = True  '<--- Re-enable before early exit
    Exit Sub
End If

Если вам нужно исправить это для экземпляра Excel, который у вас открыт, просто запустите одну строку, чтобы снова включить обновление экрана

Sub Oof ()

    Application.ScreenUpdating = True

End If
...