Excel 2010 VBA копирует данные из нескольких файлов Excel

Я искал и искал это и подошел близко, но не идеально. Вот оно...

Мне нужен код для последовательной работы с другими рабочими книгами Excel и копирования данных. Файлы будут называться 1,2,3,4 и т. д., всего до 60 макс. У меня есть код, который откроет все файлы для меня, и это прекрасно работает. Затем мне нужно, чтобы он зашел во все рабочие книги, скопировал данные настройки и вернул их в основную рабочую книгу, что я тоже смог сделать. Вот мои проблемы...

  1. Я знаю, что должен быть способ написать код один раз и заставить его работать с оставшимися файлами. IE. если первый файл называется 1.csv, может ли код сказать, что нужно сделать это на 1.csv, затем на 1.csv + 1, что означает 2.csv, а затем выйти из цикла? Кажется, что это должно быть в состоянии сделать это. Я не хочу вручную писать один и тот же код для копирования из 1.csv в 60.csv.

  2. Если есть способ зациклить его, то как закончить конец, если часть. В IE в одну неделю может быть 37 файлов, в следующую — 40 и так далее. Я хочу, чтобы он начинался с файла 1.csv и работал до тех пор, пока не дойдет до последнего активного файла 37.csv или 60.csv, а затем завершится, если файла 38.csv нет.

Вот основной записанный код, который у меня есть.

   Public Sub testr()
  Dim filenum As Integer
  Dim lastrow As Long

  filenum = 1
  On Error GoTo my_handler

  Do
    Windows(filenum & ".CSV").Activate
    Range("A25").Select
    Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
    Selection.Copy
    Windows("test.xlsm").Activate
    Range("A1").Select
    lastrow = Worksheets("Data").Cells(1, 1).End(xlDown).Row
    ActiveSheet.Paste
    filenum = filenum + 1
  Loop

my_handler:
  MsgBox "All done."
  Exit Sub
End Sub

Любая помощь, которую кто-либо мог бы дать мне, была бы потрясающей! Заранее спасибо~


person user2748160    schedule 04.09.2013    source источник


Ответы (2)


Хорошо, для кода, который у вас есть сейчас, вам нужно как минимум отредактировать, чтобы он выглядел так:

Public Sub testr()
  Dim filenum As Integer
  filenum = 1
  On Error GoTo my_handler

  Do
    Windows(filenum & ".CSV").Activate
    Range("A25").Select
    Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
    Selection.Copy
    Windows("test.xlsm").Activate
    Range("A1").Select
    ActiveSheet.Paste
    Range("A1").Select
    filenum = filenum + 1
  Loop

my_handler:
  MsgBox "All done."
  Exit Sub
End Sub
person Aaron Thomas    schedule 05.09.2013
comment
РАБОТАЛ! Макро запустилось без проблем. Однако, как обычно, еще одна проблема, которую, я думаю, будет легко исправить. Данные, которые он копирует из файлов csv, вставляются сами по себе. Я попытался добавить код для перехода к следующей пустой ячейке, а затем вставить, но это не сработало. Я использовал этот код. LastRow = Sheets(Data).Cells(Rows.Count, 1).End(xlUp).Offset(1).Row - person user2748160; 05.09.2013
comment
Отмечено, ответ принят! Для последней строки она всегда будет разной. В одном CSV-файле может быть 12 строк данных, в следующем — 30 и так далее. Я хочу скопировать все данные из 1.csv и вставить их, а затем скопировать 2.csv и вставить прямо под данными из 1.csv и двигаться дальше. У меня это работало в моем исходном коде с частью, которую я вам отправил, но когда я поместил эту часть в эту, она этого не делает. - person user2748160; 05.09.2013
comment
Не работает. Он продолжает просто вставлять A1 поверх других данных. Я прочитал другую ссылку и не вижу ничего, что помогло бы тому, что я ищу. Я отредактировал свой код, чтобы вы могли видеть, что у меня есть. - person user2748160; 05.09.2013
comment
На этом кубика нет. При этом лист возвращается совершенно пустым. Я подумал, что это может быть из-за того, что лист изначально был пустым, поэтому я вставил заголовок и начал вставку с A2, но это тоже не сработало. - person user2748160; 05.09.2013
comment
Поэтому я заменил activesheet.paste вашим кодом, и я получаю ошибку, определенную приложением или объектом, в этой строке. - person user2748160; 05.09.2013
comment
Я понял! Я использовал это. Диапазон (A и Rows.Count). Конец (xlUp). Смещение (1). Выберите - person user2748160; 05.09.2013
comment
Последний вопрос по этому поводу: эти файлы, из которых я извлекаю данные, еще не имеют имен 1,2,3,4,5 и т. д. Их нужно переименовать вручную. Есть ли способ, чтобы это не могло искать 1.csv и просто искать активные окна Excel, поэтому мне не нужно переименовывать их все. Иногда их бывает до 60, и это очень ручная работа. - person user2748160; 05.09.2013
comment
Вы можете попробовать поиграть с Члены объекта Windows, чтобы увидеть, что работает. Я бы рекомендовал изучить свойства .Count и .Item. - person Aaron Thomas; 05.09.2013
comment
Что, если бы я сразу переименовал все файлы, чтобы они стали 1 (1) 1 (2)? Могу ли я затем увеличивать (1) (2) (3) на 1 каждый раз в макросе по сравнению с увеличением имени, если csv на 1? Я попытался сделать filenum = (1), а затем добавить к этому +1, но мне это не понравилось. - person user2748160; 05.09.2013
comment
Получил и этот! Только что написал еще один скрипт для переименования всех файлов в папке для меня. Еще раз спасибо за вашу помощь. Ты великолепен! - person user2748160; 05.09.2013

Вы можете попробовать обернуть все это в DO...LOOP. Если вы не знаете, со сколькими CSV-файлами вы будете работать, просто добавьте обработчик ошибок, чтобы выйти, как только файлы больше не будут найдены.

Вы можете использовать конкатенацию строк, чтобы изменить имена файлов: например, используя переменную с именем номер файла, если номер файла = 1, то номер файла и ".csv" будет "1.csv", если номер файла = 2, то номер файла и ".csv" будет "2.csv" и т. д.

Например:

Public Sub testr()
Dim filenum As Integer
filenum = 1
On Error GoTo my_handler
Do
  Windows(filenum & ".CSV").Activate
  'rest of code goes here
filenum = filenum + 1
Loop

my_handler:
  MsgBox "All done."
Exit Sub
person Aaron Thomas    schedule 04.09.2013
comment
Спасибо за ответ Аарон! Как бы я добавил конкатенацию в код для этого? Идея имеет смысл в тексте, но как она переводится в VBA? Кроме того, как мне использовать цикл и конкатенацию вместе? - person user2748160; 04.09.2013
comment
ОК, я получил его для использования с вашим кодом, но в цикле резервного копирования он говорит мне, что Windows (filenum & .CSV). Activate - это индекс вне диапазона и не будет переходить к следующему файлу или 2.CSV и ошибки. есть идеи? - person user2748160; 05.09.2013
comment
Вы можете попробовать создать строку для имени файла и использовать эту строку для метода Windows.Activate. Например, dim имя_файла как строка; имя_файла = номер файла & .csv; Windows(имя_файла).Активировать - person Aaron Thomas; 05.09.2013
comment
Не могу заставить это работать. Ему не нравится метод активации Windows с Windows (имя_файла) - person user2748160; 05.09.2013
comment
Просто проверяю, а окно действительно открыто? Я предполагаю, что ваш исходный код выше - Windows (1.CSV). Activate - работал правильно? - person Aaron Thomas; 05.09.2013
comment
Да, у меня все файлы csv открыты при запуске. Исходный код работал идеально, но проблема заключалась в том, что я никогда не знал, сколько CSV-файлов у меня будет, поэтому я искал способ написать его, поэтому он просто работал до тех пор, пока не нашел больше CSV-файлов, а затем закончился - person user2748160; 05.09.2013
comment
Я проверил это на своей установке, используя фиктивные окна 1.csv, 2.csv и 3.csv. Код работает так же хорошо, как первоначально было предложено в моем ответе выше. Может быть, проблема в чем-то другом, возможно, вы не изменили свой код, чтобы включить my_handler? Я еще раз отредактирую свой ответ, чтобы показать, как это сделать. - person Aaron Thomas; 05.09.2013
comment
Хм.. наверное. Поэтому я попробовал еще раз и все равно получаю ошибку. Может быть, это то, как я помещаю туда код? Я объявляю DIM вверху, а затем копирую ваш код точно так, как он есть, в раздел ниже, а затем добавляю остальную часть. Теперь я получаю сообщение об ошибке Label notdefined, и похоже, что эта ошибка связана с my_handler. Должен ли я делать что-то еще с my_handler ниже цикла? - person user2748160; 05.09.2013
comment
Есть ли способ отредактировать свой вопрос, а затем в конце вопроса показать, что у вас есть на данный момент? - person Aaron Thomas; 05.09.2013
comment
Я отредактировал свой вопрос выше для вас. Кстати, большое спасибо всем за помощь в этом!! - person user2748160; 05.09.2013