Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 10.07.2013
Сообщений: 18

В чем ошибка в коде макроса Эксель?

10.07.2013, 14:22. Показов 1700. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Господа, доброго времени суток.
Прошу помощи, задача такова:
Два файла (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"

Visual Basic
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
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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.07.2013, 14:22
Ответы с готовыми решениями:

Ошибка в коде макроса
Здравствуйте. У меня проблема с кодом макроса VBA. Задача следующая : &quot;Макрос превращает таблицу &quot;Исходные данные&quot; в таблицу...

Создание макроса нумерации в Эксель
Здравствуйте! Помогите пожалуйста решить небольшую проблему Имеется файл Эксель с шаблоном Создан макрос , который копирует это...

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

5
 Аватар для Step_UA
1591 / 664 / 225
Регистрация: 09.06.2011
Сообщений: 1,334
10.07.2013, 15:06
Используйте одну из записей:
Visual Basic
1
2
3
sB.Worksheets(1).Range(Cells(k, 1), Cells(k, 6)).Value = wB.Worksheets(1).Range(Cells(i, 1), Cells(i, 6)).Value
или
sB.Worksheets(1).Cells(k, 1).Resize(, 6).Value = wB.Worksheets(1).Cells(i, 1).Resize(, 6).Value
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
10.07.2013, 15:55
Вся беда в том, что не написано, чьи cells используете.
Нужно указывать конкретно, как в "если строку записываю в таком виде: sB.Worksheets(1).Cells(k, 1)..."
Т.е.

Visual Basic
1
2
3
with sB.Worksheets(1)
Range(.Cells(k, 1), .Cells(k, 6)) = Range(.Cells(i, 1), .Cells(i, 6)).Value
end with
1
 Аватар для Step_UA
1591 / 664 / 225
Регистрация: 09.06.2011
Сообщений: 1,334
10.07.2013, 16:12
Hugo121, абсолютно согласен ... предпочитаю работать через Resize - первая строка из 2 поста неправильная
Поправил код:
Visual Basic
1
2
3
with wB.Worksheets(1)
    Range(Cells(k, 1), Cells(k, 6)).Value = .Range(.Cells(i, 1), .Cells(i, 6)).Value
end with
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
10.07.2013, 16:53
Упс, сослепу не разглядел, что там разные листы...
Но на суть это не влияет - в общем нужно их указывать непосредственно перед Cells.
Вот это:
Visual Basic
1
Range(Cells(k, 1), Cells(k, 6)).Value =
будет относиться к активному листу. А какой там активный - это нужно весь код отслеживать...
0
0 / 0 / 0
Регистрация: 10.07.2013
Сообщений: 18
31.07.2013, 14:43  [ТС]
Братцы спс большое, разобрался.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.07.2013, 14:43
Помогаю со студенческими работами здесь

Зависает эксель при запуске макроса
Здравствуйте гении!!! помогите пожалуйста, запускаю вот этот макрос и эксель зависает в смерть, можно что то тут сделать? За ранее...

Запуск макроса в файле эксель - путем запуска скрипта VBScript
Всем доброго дня. Помогите решить вопрос. Есть открытый файл эксель 111.xls В нем находятся три макроса: Макрос1, Макрос2,...

В чем ошибка в коде?
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int main() { system(&quot;chcp 1251&quot;); int n,S,i; printf(&quot;Write here: &quot;); ...

В чем ошибка в коде?
В чем ошибка в коде? mport re f = open('urok11.txt') r = f.read().split() file = f.strip() re_ = re.compile(r'\s\s+') res =...

В чем ошибка в коде?
#include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; int main(int argc, char *argv) { char rs='y'; if (rs == 'y') ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru