Копировать из одной книги в другую с помощью цикла - PullRequest
0 голосов
/ 10 июля 2020

Я разработал приведенный ниже код, однако он показывает мне ошибку здесь. Ошибка выполнения 9 и 13. Что касается части, макрос должен копировать данные из одной книги в другую. Я знаю, что неправильно назначил переменные, но не знаю, как их изменить.

Workbooks(wbk).Worksheets(FieldBVal).Range("A1:V1000").Copy Workbooks(recon).Worksheets(FieldAVal).Range("B2")

Вкратце, что должен делать макрос. Он должен просто копировать листы из одной книги в другую. Каждый лист относится к одной компании, поэтому он должен относиться к другой книге, а также к листу с тем же названием компании. Поэтому я решил поместить в Excel название листов, где находится макрос. Может случиться так, что компании будут добавлены, удалены, чтобы пользователь мог легко изменить имя рабочих листов или добавить новый (не зная структуры макроса), но, к сожалению, это не работает. Может ли кто-нибудь мне помочь?

Код:

Sub Copy data()

Workbooks.Open Range("A10").Value

For Each wb In Application.Workbooks
    If wb.Name Like "*Reconciliation*" Then
        wb.Activate
        Exit For
    End If
Next wb

Set wbk = Workbooks(Range("A9").Value)
Set recon = Workbooks(Range("A11").Value)


    Sheets("Macro").Select
    Range("B6").Select
  
    Dim i As Integer
    Dim FieldAVal As String
    Dim FieldBVal As String

    Dim Iter As Integer
    Iter = Cells(1, 3).Value

  
                   
             For i = 1 To Iter
                FieldAVal = Cells(i + 5, 2).Value
                FieldBVal = Cells(i + 5, 3).Value
                 'SAP code to be executed for each row
              
Workbooks(wbk).Worksheets(FieldBVal).Range("A1:V1000").Copy Workbooks(recon).Worksheets(FieldAVal).Range("B2") here shows error
              

                Next i
End Sub

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

спасибо за отзыв, но ошибка при копировании и вставке части все еще возникает. Я назвал листы и книги, но эта комбинация ниже не работает.

Workbooks(wbk1).Worksheets(ws1).Range("A1:V1000").Copy Workbooks(wbk2).Worksheets(ws2).Range("B2")

Sub CopyData()

  Dim i As Integer
    Dim FieldAVal As String
    Dim FieldBVal As String
    Dim FieldCVal As String
    Dim FieldDVal As String
    Dim wbk1 As Workbook
    Dim wbk2 As Workbook
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Dim Iter As Integer
    Dim recon As Workbook
    Dim FilePath As String
   
    
   

FilePath = ThisWorkbook.Worksheets("Macro").Cells(11, 1)


Set recon = Workbooks(FilePath)



Workbooks.Open Range("A10").Value
 recon.Activate
    
  
    Iter = Cells(1, 3).Value
   
    
                    
             For i = 1 To Iter
                FieldAVal = Cells(i + 14, 2).Value
                FieldBVal = Cells(i + 15, 3).Value
                FieldCVal = Cells(i + 16, 4).Value
                FieldDVal = Cells(i + 17, 5).Value
                
 Set wbk1 = Workbooks(FieldDVal)
   Set wbk2 = Workbooks(FieldCVal)
    Set ws1 = wbk1.Sheets(FieldBVal)
  Set ws2 = wbk2.Sheets(FieldAVal)

                
Workbooks(wbk1).Worksheets(ws1).Range("A1:V1000").Copy Workbooks(wbk2).Worksheets(ws2).Range("B2")
                

                Next i
End Sub
0 голосов
/ 10 июля 2020

Установите логин c перед тем, как начать писать код. Начните с записи Option Explicit в верхней части вашего пустого модуля кода.

  1. Похоже, у вас есть рабочая книга с именем , например «Согласование». Кажется, вы хотите назвать эту книгу Wb. Поэтому ваша первая строка кода должна быть

    Dim Wb As Workbook 'книга согласования

  2. Похоже, что где-то в этой книге есть ячейки A9 и A11. Куда? На листе. Какой рабочий лист? Это приведет вас ко второй строке кода.

    Dim Ws As Worksheet 'рабочий лист, из которого можно собрать информацию о компании

  3. Продолжайте так, пока не определите каждую часть вашего проекта по его характеру (рабочая книга, рабочий лист, строка, номер), по его функции в вашем проекте (поставщик данных, получатель данных, помощник) и присвоено ему имя.

Set wbk = Workbooks (Range ("A9"). Value) Set recon = Workbooks (Range ("A11"). Value)

создает два объекта книги. Вы не объявили их и не указали их функции в вашем проекте. Но ясно, что ваш код не сработает, если диапазоны A9 и A11 не содержат имен открытых книг. Они должны быть открыты, потому что ваш код не открывает их, даже если ячейки содержат полные имена файлов с соответствующими путями.

Обратите внимание, что и A9, и A11 находятся в ActiveSheet. Это потому, что вы не указываете какой-либо конкретный лист. ActiveSheet будет любым листом в объекте Wb с именем , например «Согласование», который активен в данный момент - очень расплывчатое описание. Шансы на то, что правильный лист будет найден, очень малы.

Вся эта путаница вызвана отсутствием планирования перед тем, как вы начали писать код. Go назад и начать заново. Думайте гораздо меньшими шагами, чем вы делали до сих пор. Однако один шаг, о котором вы не должны думать, - это что выбрать или активировать . Ответ однозначно «Ничего». Wb.Worksheets("MySheet 1").Cells(9, "A") - очень четкий адрес. VBA может это найти. Он может получить свои Value, RowHeight, Formula и изменить любое из них и многое другое, как только сможет Select или Activate. Активация и выбор - это действие, необходимое пользователю. VBA или Excel этого не делают.

И, прежде чем я забыл, адреса VBA располагаются по имени, а ячейки - по их координатам. Range("A9") - это обходной путь для использования синтетического c имени для диапазона, который представляет собой одну ячейку. Ничего хорошего из такой акробатики не выйдет. Поскольку вы уже освоили синтаксис адресации ячеек, используйте его для этой цели. Используйте имена для адресации диапазонов нескольких ячеек, но помните, что такие имена, как «A1: C7», искусственно созданы из координат ячеек. Это отличная система, но, увы, самая низкая ступенька на этой лестнице. Вы можете сделать гораздо больше с настоящими именами, которые вы сами создаете и управляете им.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...