powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Помогите понять причину ошибки в коде макроса VBA(Excel).
11 сообщений из 11, страница 1 из 1
Помогите понять причину ошибки в коде макроса VBA(Excel).
    #38326682
Сергей_Ро
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, доброго времени суток.
Задача такова:
Два файла(Excel) сравниваю на совпадения по нескольким столбцам одновременно и если совпадения нет то пишу в другой файл целиком строку(ну или первые 6сть ячеек строки). Следующий код выдает ошибку: Run-time error '1004' Application-defined or object-defined error. Ругается на строку "sB.Worksheets(1).Range(Cells(k, 1), Cells(k, 6)) = wB.Worksheets(1).Range(Cells(i, 1), Cells(i, 6)).Value"

Собственно сам код:

Sub CombiFiles()
Dim myName As String, wB As Workbook
With Application.FileDialog(msoFileDialogFilePicker)
.Title = "Выберите ПЕРВЫЙ файл для сравнения"
.Show
If .SelectedItems.Count = 0 Then Exit Sub
myName = .SelectedItems(1)
End With
Application.ScreenUpdating = False
Workbooks.Open Filename:=myName: Set wB = Workbooks(ActiveWorkbook.Name)

Dim myName1 As String, wB1 As Workbook
With Application.FileDialog(msoFileDialogFilePicker)
.Title = "Выберите ВТОРОЙ файл для сравнения"
.Show
If .SelectedItems.Count = 0 Then Exit Sub
myName1 = .SelectedItems(1)
End With
Application.ScreenUpdating = False
Workbooks.Open Filename:=myName1: Set wB1 = Workbooks(ActiveWorkbook.Name)

Dim SaveFile As String, sB As Workbook
With Application.FileDialog(msoFileDialogFilePicker)
.Title = "Выберите файл для сохранения"
.Show
If .SelectedItems.Count = 0 Then Exit Sub
SaveFile = .SelectedItems(1)
End With
Application.ScreenUpdating = False
Workbooks.Open Filename:=SaveFile: Set sB = Workbooks(ActiveWorkbook.Name)

Dim i As Long, j As Long, k As Long, Flag1 As Boolean


i = 1: k = 1
Do While wB.Worksheets(1).Cells(i, 1) <> ""
' Проверяем в 1 файле на 1 листе строки 1-го столбца, от 1 до пустой, то есть до конца таблицы.
j = 1: Flag1 = False ' Flag - это признак, что запись из Файла1 есть или нет в Файле2.

Do While wB1.Worksheets(1).Cells(j, 1) <> ""
' Проверяем во 2 файле на 1 листе строки 1-го столбца, от 1 до пустой, то есть до конца таблицы.
If wB.Worksheets(1).Cells(i, 3) = wB1.Worksheets(1).Cells(j, 75) And wB.Worksheets(1).Cells(i, 4) = wB1.Worksheets(1).Cells(j, 196) And wB.Worksheets(1).Cells(i, 5) = wB1.Worksheets(1).Cells(j, 22) Then Flag1 = True
' Нашли запись из Файла1 в Файле2, устанавливаем Flag в True
j = j + 1
Loop

If Flag1 = False Then ' Если запись из Файла1 не встретилась в файле2, то
sB.Worksheets(1).Range(Cells(k, 1), Cells(k, 6)) = wB.Worksheets(1).Range(Cells(i, 1), Cells(i, 6)).Value
' Записываем ее в Файл3
k = k + 1 ' Переходим на следующую строчку в Файле3
End If
i = i + 1
Loop
MsgBox "Выполнение сравнения законченно успешно"
End Sub

Помогите понять причину ошибки, с VBA работаю совсем недавно может месяц, сам причину не понимаю.
И еще если строку записываю в таком виде: sB.Worksheets(1).Cells(k, 1) = wB.Worksheets(1).Cells(i, 1).Value то нормально отрабатывает, но мне нужно писать в файл как минимум данные из 6ти ячеек в строке, а эта строка копирует только значение одной ячейки. I need you help!
...
Рейтинг: 0 / 0
Помогите понять причину ошибки в коде макроса VBA(Excel).
    #38326705
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первое. К чему у вас относится Cells? Почему-то Worksheets и т.д. вы предваряете объектом (sB, wB), а Cells - нет
Второе. Если нужно скопировать значения нескольких ячеек диапазона - либо перечисляйте их в цикле (For ... Next, For Each ... Next), либо используйте метод .Copy диапазона:
Код: vbnet
1.
wB.Worksheets(1).Range(Cells(i, 1), Cells(i, 6)).Copy Destination:=sB.Worksheets(1).Cells(k, 1)
...
Рейтинг: 0 / 0
Помогите понять причину ошибки в коде макроса VBA(Excel).
    #38326712
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Учимся использовать тэги оформления кода - FAQ
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
Sub CombiFiles()

Dim myName As String, wB As Workbook
With Application.FileDialog(msoFileDialogFilePicker)
.Title = "Выберите ПЕРВЫЙ файл для сравнения"
.Show
If .SelectedItems.Count = 0 Then Exit Sub
myName = .SelectedItems(1)
End With
Application.ScreenUpdating = False
Workbooks.Open Filename:=myName: Set wB = Workbooks(ActiveWorkbook.Name)

Dim myName1 As String, wB1 As Workbook
With Application.FileDialog(msoFileDialogFilePicker)
.Title = "Выберите ВТОРОЙ файл для сравнения"
.Show
If .SelectedItems.Count = 0 Then Exit Sub
myName1 = .SelectedItems(1)
End With
Application.ScreenUpdating = False
Workbooks.Open Filename:=myName1: Set wB1 = Workbooks(ActiveWorkbook.Name)

Dim SaveFile As String, sB As Workbook
With Application.FileDialog(msoFileDialogFilePicker)
.Title = "Выберите файл для сохранения"
.Show
If .SelectedItems.Count = 0 Then Exit Sub
SaveFile = .SelectedItems(1)
End With
Application.ScreenUpdating = False
Workbooks.Open Filename:=SaveFile: Set sB = Workbooks(ActiveWorkbook.Name)

Dim i As Long, j As Long, k As Long, Flag1 As Boolean


i = 1: k = 1
Do While wB.Worksheets(1).Cells(i, 1) <> ""
' Проверяем в 1 файле на 1 листе строки 1-го столбца, от 1 до пустой, то есть до конца таблицы.
   j = 1: Flag1 = False  ' Flag - это признак, что запись из Файла1 есть или нет в Файле2.
   
   Do While wB1.Worksheets(1).Cells(j, 1) <> ""
   ' Проверяем во 2 файле на 1 листе строки 1-го столбца, от 1 до пустой, то есть до конца таблицы.
       If wB.Worksheets(1).Cells(i, 3) = wB1.Worksheets(1).Cells(j, 75) And wB.Worksheets(1).Cells(i, 4) = wB1.Worksheets(1).Cells(j, 196) _
          And wB.Worksheets(1).Cells(i, 5) = wB1.Worksheets(1).Cells(j, 22) Then Flag1 = True
       ' Нашли запись из Файла1 в Файле2, устанавливаем Flag в True
       j = j + 1
   Loop
      
   If Flag1 = False Then  ' Если запись из Файла1 не встретилась в файле2, то
       sB.Worksheets(1).Range(Cells(k, 1), Cells(k, 6)) = wB.Worksheets(1).Range(Cells(i, 1), Cells(i, 6)).Value
       ' Записываем ее в Файл3
       k = k + 1 ' Переходим на следующую строчку в Файле3
   End If
  i = i + 1
Loop
MsgBox "Выполнение сравнения законченно успешно"
End Sub
...
Рейтинг: 0 / 0
Помогите понять причину ошибки в коде макроса VBA(Excel).
    #38326789
Сергей_Ро
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTMПервое. К чему у вас относится Cells? Почему-то Worksheets и т.д. вы предваряете объектом (sB, wB), а Cells - нет
Второе. Если нужно скопировать значения нескольких ячеек диапазона - либо перечисляйте их в цикле (For ... Next, For Each ... Next), либо используйте метод .Copy диапазона:
Код: vbnet
1.
wB.Worksheets(1).Range(Cells(i, 1), Cells(i, 6)).Copy Destination:=sB.Worksheets(1).Cells(k, 1)



Спасибо за совет. Попробовал эффект тот же, та же ошибка, только на вашей строке.
...
Рейтинг: 0 / 0
Помогите понять причину ошибки в коде макроса VBA(Excel).
    #38326846
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей_Рота же ошибка, только на вашей строке.Так а первый-то пункт учли (что Cells надо тоже предварить квалификатором объекта, к которому относится диапазон)?
...
Рейтинг: 0 / 0
Помогите понять причину ошибки в коде макроса VBA(Excel).
    #38326868
Сергей_Ро
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTMСергей_Рота же ошибка, только на вашей строке.Так а первый-то пункт учли (что Cells надо тоже предварить квалификатором объекта, к которому относится диапазон)?

Можно вот тут поподробнее, так сказать на пальцах. Не очень понял фразу "Cells надо тоже предварить квалификатором объекта, к которому относится диапазон". Заранее спасибо.
...
Рейтинг: 0 / 0
Помогите понять причину ошибки в коде макроса VBA(Excel).
    #38326899
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей_Ро,

Код: vbnet
1.
wB.Worksheets(1).Range(wB.Worksheets(1).Cells(i, 1), wB.Worksheets(1).Cells(i, 6)).Copy
...
Рейтинг: 0 / 0
Помогите понять причину ошибки в коде макроса VBA(Excel).
    #38326926
Сергей_Ро
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProСергей_Ро,

Код: vbnet
1.
wB.Worksheets(1).Range(wB.Worksheets(1).Cells(i, 1), wB.Worksheets(1).Cells(i, 6)).Copy



А если так?

Код: vbnet
1.
 MyRange:=wb.Worksheets(1) as Range 



и потом так?

Код: vbnet
1.
 wB.Worksheets(1).Range(MyRange.Cells(i, 1), MyRange.Cells(i, 6)).Copy 


Пройдет такой вариант?
...
Рейтинг: 0 / 0
Помогите понять причину ошибки в коде макроса VBA(Excel).
    #38326946
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей_РоА если так?
Код: vbnet
1.
 MyRange:=wb.Worksheets(1) as Range 


и потом так?
Тогда уж так
Код: vbnet
1.
2.
3.
Dim MyWbSheet As Worksheet
Set MyWbSheet = wb.Worksheets(1)
MyWbSheet.Range(MyWbSheet.Cells(i,1), ...

и т.д.
Но вы ещё забыли про Cells в Copy Destination (которые тоже надо квалифицировать), а там ведь другой лист...
С другой стороны, зачем заводить объектную переменную, чтобы использовать её только в одной строке? Компилятору-интерпретатору без разницы, какой длины код вы напишете, тем более, что вы его формируете программно.
...
Рейтинг: 0 / 0
Помогите понять причину ошибки в коде макроса VBA(Excel).
    #38326951
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
во-первых
Код: vbnet
1.
2.
Dim MyRange As Range
Set MyRange=wb.Worksheets(1)

(определить переменную, добавить Set, убрать двоеточие - это тебе не паскаль и не сипипи

во-вторых почему тогда и первую ссылку не заменить
Код: vbnet
1.
MyRange(MyRange.Cells(i, 1), MyRange.Cells(i, 6)).Copy 
...
Рейтинг: 0 / 0
Помогите понять причину ошибки в коде макроса VBA(Excel).
    #38326967
Сергей_Ро
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTM и Shocker.Pro выражаю огромную Вам благодарность, разобрался, запустил, работает как надо. Большое человеческое спасибо!!!
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Помогите понять причину ошибки в коде макроса VBA(Excel).
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]