Как полностью объединить два листа — с различными именами, форматами и названиями таблиц

#vba #excel #import

#vba #excel #импорт

Вопрос:

Хорошо, я работаю над созданием «универсальной» электронной таблицы.

Я работаю с клиентами, которые предоставляют нам расписания, все в разных форматах и в разных формах, но все в Excel (.xlsx).

Цель состоит в том, чтобы иметь возможность создать «инструмент Excel», если хотите, чтобы одним нажатием кнопки я мог перейти к заданному мне расписанию и импортировать его в инструмент. Затем с помощью этого инструмента я могу продолжать использовать другие скрипты VBA (которые я уже собрал) для извлечения из других таблиц Excel и, следовательно, превратить инструмент в красиво оформленный файл с несколькими листами, включая всю информацию о клиентах.

Проблема, с которой я сталкиваюсь, заключается в том, что я получаю расписания от клиента без какой-либо согласованности. Они дают расписаниям случайные имена, иногда они не используют таблицы, и они переименовывают листы во всевозможные вещи. До сих пор мне удалось найти способ автоматизировать объединение двух электронных таблиц, но он работает только в том случае, если расписание имеет одинаковое местоположение и имена.

Есть идеи по какому-либо обходному пути?

Возможно, скрипт vba, который откроет проводник Windows, позволит мне выбрать нужный мне лист Excel и просто импортировать все в инструмент, все форматирование и листы, независимо от имени (ов) и количества?

Комментарии:

1. Application.GetOpenFilename() это хорошее место для начала: для остальной части вам нужно будет предоставить более подробную информацию о том, насколько изменчивы входные файлы. Не существует единого метода «импортировать файл независимо от структуры» — его нужно будет адаптировать к вашим входным данным.

2. @Tim Williams — Итак; к сожалению, они различаются в такой высокой степени, что их трудно привести в исполнение. Тем не менее, я сделаю все возможное здесь. Я думаю, что трудная часть заключается в том, что они никогда не называют листы или сам рабочий лист целиком, каким-либо одним именем. Например, иногда у нас есть «Schedule 10/06 facility 12345.xslx», в других случаях это «Schedule 1.xslx». Кроме того, сами листы никогда не бывают согласованными. иногда они называют их «Расписание» и «План связи», в других случаях они просто оставляют их на листах по умолчанию 1, 2 и 3. Надеюсь, это имело немного больше смысла

3. Я думаю, если возможно, моей целью было бы иметь возможность выбрать файл; и импортировать все листы, которые существуют на указанном листе.

4. Вы можете либо поместить все входные данные в одну папку и перебирать их, либо использовать GetOpenFileName для их выбора. Что касается имен листов, вы можете рассмотреть возможность использования position, если имена несовместимы, или искать общий текст на листах, чтобы решить, что есть что. Как бы вы это ни делали, вам нужно будет написать код, поэтому я бы начал с этого и отправил ответ, если вы столкнетесь с конкретными проблемами.

5. Отлично, вот что у меня получилось.

Ответ №1:

Хорошо, итак, у меня есть:

      Sub HC_import()
            Dim wb1 As Workbook, wb2 As Workbook, wb3 As Workbook
            Dim Ret1
            Dim Ret2

            Set wb1 = ActiveWorkbook

            On Error Resume Next

            '~~> Get the Health Check File
            Ret1 = Application.GetOpenFilename("Excel Files (*.xls*), *.xls*", _
            , "Please select the HC File")
            If Ret1 = False Then Exit Sub

            Set wb2 = Workbooks.Open(Ret1)

            '~~> Copy STNHC Data from Health Check File
        wb2.Activate
        Sheets("STNHC").Select
        ActiveSheet.ShowAllData
        ActiveSheet.ListObjects(1).Unlist
        Range("A1").Select
        Range(Selection, Selection.SpecialCells(xlLastCell)).Select
        Selection.Copy


            '~~> Paste STNHC Data to Tool
        wb1.Activate

            Sheets.Add After:=ActiveWorkbook.Sheets(1)
            ActiveSheet.Name = "HEALTH_CHECK"
            Sheets("HEALTH_CHECK").Select
            Range("A1").Select
            Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
            Application.CutCopyMode = False

        '~~> Copy PatchETL Data to Tool
        wb2.Activate
        Sheets("PatchETL").Select
        ActiveSheet.ShowAllData
        Range("A:I").Select
        Selection.Copy
End Sub
  

Это работает хорошо, предполагая, что лист всегда называется «STNHC» — мне нужно что-то похожее; но это будет работать независимо от того, как называются листы.

Ответ №2:

Однако, если я вас правильно понял, это невероятно расплывчато… Что, если вы возьмете все файлы Excel, поместите их в папку 1, затем напишите простой скрипт vbs для переименования всех файлов, содержащих «.xls» в указанной папке, в согласованное имя файла, затем попросите скрипт просмотреть одни и те же файлы, чтобы переименовать все листы в то, что вам нужно, т.е.»STNHC». Тогда ваши файлы будут согласованы для работы с вашим существующим инструментом?