С Новым годом! Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/42: Рейтинг темы: голосов - 42, средняя оценка - 4.71
2 / 2 / 0
Регистрация: 19.08.2019
Сообщений: 45
Excel

Сравнение ячейки с массивом

19.08.2019, 17:23. Показов 9250. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сделал такой макрос. Он сравнивает ячейку в столбце "А" на 2 листе с ячейкой столбца "А" на первом и если нет совпадения, записывает данные ячейки столбца "А" и "В" с первого листа в конец столбца "А" и "В" на втором.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub Oks()
 '--------------------------------------------------------------------------
Dim iLastRow As Long, i As Long, LastRow As Long
 
iLastRow = Sheets("Лист 1").Cells(Rows.Count, 1).End(xlUp).Row
LastRow = Sheets("Лист 2").Cells(Rows.Count, 1).End(xlUp).Row
      For i = 5 To iLastRow
            If Sheets("Лист 2").Cells(i, 1) <> Sheets("Лист 1").Cells(i, 1) Then
                  Sheets("Лист 1").Range(Sheets("Лист 1").Cells(i, 1), Sheets("Лист 1").Cells(i, 2)).Copy Sheets("Лист 2").Cells(LastRow + 1, 1)
                   LastRow = LastRow + 1
                End If
            Next
   End Sub
Проблема.

Нужно сделать так чтобы сравнение было не построчно а по масиву (масив столбца "А" 1 листа сравнивался с масивом столбца "А" 2 листа, и всё что не совпало записать в конец столбца "А" на втором листе).

Помогите пожалуйста у меня не получается сравнить по масивах.
Вложения
Тип файла: zip 333.zip (13.6 Кб, 9 просмотров)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.08.2019, 17:23
Ответы с готовыми решениями:

Сравнение значения с массивом (Excel)
такая ситуация: есть ячейка, в которую вводится номер розничной группы (от 000 до 273). на листе2 показаны в столбце А - номера группы, а...

Сравнение 2 одномерных массивом и выбор элементов по условию
Всем доброго времени суток. Есть задача: есть 2 массива, в каждом по 10 цифр. нужно найти те элементы, в которых числа массива 2 больше...

Сравнение textBox и ячейки
Народ, такой вопрос, мне необходимо выполнить сравнение значения вводимого в textBox и последней записи в столбце. Пытался след образом: ...

14
1847 / 1162 / 354
Регистрация: 11.07.2014
Сообщений: 4,107
19.08.2019, 18:56
RolanLev, может объясните чем ваше "построчно" отличается от "по массиву". Хотите диапазон ячеек перенести в массив или как?
Или каждое значение сравнивается со всеми значениями массива?
0
2 / 2 / 0
Регистрация: 19.08.2019
Сообщений: 45
19.08.2019, 19:15  [ТС]
Цитата Сообщение от Burk Посмотреть сообщение
каждое значение сравнивается со всеми значениями массива
мне нужно так, иначе появляются дубли.
0
1847 / 1162 / 354
Регистрация: 11.07.2014
Сообщений: 4,107
20.08.2019, 06:24
RolanLev, подобная тема и она не одна Проверка двух списков
и если прокрутить колёсико мыши ниже, в Похожие темы можно, я думаю, посмотреть Сравнение ячейки со столбцом в Excel
0
2 / 2 / 0
Регистрация: 19.08.2019
Сообщений: 45
20.08.2019, 10:44  [ТС]
Почитал те темы и понял что со словарём у меня не получится (ничего там не понял).
попробовал изменить свой код, на ругается на Next i

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub Oks()
 Dim iLastRow As Long, i As Long, LastRow As Long
iLastRow = Sheets("Лист1").Cells(Rows.Count, 1).End(xlUp).Row
LastRow = Sheets("Лист2").Cells(Rows.Count, 1).End(xlUp).Row
       For i = 5 To iLastRow
          For j = 5 To LastRow
            If Sheets("Лист2").Range("A" & j) <> Sheets("Лист1").Range("A" & i) Then
                  Sheets("Лист1").Range(Sheets("Лист1").Cells(i, 1), Sheets("Лист1").Cells(i, 2)).Copy Sheets("Лист2").Cells(LastRow + 1, 1)
                   LastRow = LastRow + 1
                End If
        Next i
    Next j
  
End Sub
Помогите понять пожалуйста.
И это я сделал сравнение с масивом? (а то я тоже не понял).
0
3946 / 2339 / 790
Регистрация: 02.11.2012
Сообщений: 6,216
20.08.2019, 11:10
Цитата Сообщение от RolanLev Посмотреть сообщение
ругается на Next i
вы закрываете первый цикл не закончив второй.
Visual Basic
1
2
Next j
Next i
в суть задачи не вникал.
0
2 / 2 / 0
Регистрация: 19.08.2019
Сообщений: 45
20.08.2019, 11:20  [ТС]
Цитата Сообщение от Vlad999 Посмотреть сообщение
вы закрываете первый цикл не закончив второй.
Спасибо. теперь не ругается.

Но это мне не помогло. после выполнение макроса появилось очень много дублей. Значить мой подход не верен(.
0
3946 / 2339 / 790
Регистрация: 02.11.2012
Сообщений: 6,216
20.08.2019, 11:31
Цитата Сообщение от RolanLev Посмотреть сообщение
И это я сделал сравнение с масивом?
нет.
алгоритм такой
1. берется некая переменная равная false
2. берем первое значение и в цикле сверяем с значениями второго листа, если находим совпадение то false меняем на true и выходим из цикла.
3. после второго цикла ставим проверку, если false то копируем, иначе ничего не делаем.
4. обнуляем переменную (прописываем false)
5. берем следующее значение и повторяем шаги 2-4.
Как то так.

Добавлено через 2 минуты
задача: с лист 1 скопировать на лист 2 то чего нет на лист 2? без повторов? Сравнивать только по столбцу "А"?
0
2 / 2 / 0
Регистрация: 19.08.2019
Сообщений: 45
20.08.2019, 11:36  [ТС]
Цитата Сообщение от Vlad999 Посмотреть сообщение
задача: с лист 1 скопировать на лист 2 то чего нет на лист 2? без повторов? Сравнивать только по столбцу "А"?
Да. Только скопировать с листа 1 столбцы "А" и "В" в конец столбца "А" на втором листе
0
3946 / 2339 / 790
Регистрация: 02.11.2012
Сообщений: 6,216
20.08.2019, 11:38
пример не удачный, там копировать не чего.
0
2 / 2 / 0
Регистрация: 19.08.2019
Сообщений: 45
20.08.2019, 11:52  [ТС]
Пример повторно.
Вложения
Тип файла: rar 333.rar (7.5 Кб, 18 просмотров)
0
2 / 2 / 0
Регистрация: 19.08.2019
Сообщений: 45
20.08.2019, 11:53  [ТС]
Цитата Сообщение от Vlad999 Посмотреть сообщение
пример не удачный
Пример повторно.
0
3946 / 2339 / 790
Регистрация: 02.11.2012
Сообщений: 6,216
20.08.2019, 14:47
Лучший ответ Сообщение было отмечено RolanLev как решение

Решение

проверяйте
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub vvv()
With Sheets("Лист2")
Lr = .Cells(Rows.Count, 1).End(xlUp).Row
a = .Range("A1:A" & Lr).Value
Set sd = CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(a)
        sd.Item(a(i, 1)) = ""
    Next
    
For i = 1 To Sheets("Лист1").Cells(Rows.Count, 1).End(xlUp).Row
    If Not sd.Exists(Sheets("Лист1").Cells(i, 1).Value) Then
        sd.Item(Sheets("Лист1").Cells(i, 1).Value) = ""
        Lr = Lr + 1
        .Cells(Lr, 1) = Sheets("Лист1").Cells(i, 1)
        .Cells(Lr, 2) = Sheets("Лист1").Cells(i, 2)
    End If
Next
End With
End Sub
2
2 / 2 / 0
Регистрация: 19.08.2019
Сообщений: 45
20.08.2019, 15:45  [ТС]
Цитата Сообщение от Vlad999 Посмотреть сообщение
проверяйте
Работает (немного подправил под свою глобальную задачу)

Большое тебе человеческое СПАСИБО. (ибо сижу уже неделю над этой задачей).

Добавлено через 14 минут
Возможно кому-то пригодится. Макрос этот умеет перебирать все файлы в папке и в файлах делать любое что впишете между Start и Stop.

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
Function GetAnotherWorkbook() As Workbook
   On Error Resume Next
    Dim coll As New Collection, wB As Workbook
    For Each wB In Workbooks
        If wB.Name <> ActiveWorkbook.Name Then
            If Windows(wB.Name).Visible Then coll.Add CStr(wB.Name)
        End If
    Next wB
    Select Case coll.Count
        Case 1    ' открыта еще только одна книга - ее и возвращаем
           Set GetAnotherWorkbook = Workbooks(coll(1))
            If IsNumeric(res) Then Set GetAnotherWorkbook = Workbooks(coll(Val(res)))
    End Select
End Function
 
Function FilenamesCollection(ByVal FolderPath As String, Optional ByVal Mask As String = "", _
                             Optional ByVal SearchDeep As Long = 1) As Collection
    ' Получает в качестве параметра путь к папке FolderPath,
   ' маску имени искомых файлов Mask (будут отобраны только файлы с такой маской/расширением)
   ' и глубину поиска SearchDeep в подпапках (если SearchDeep=1, то подпапки не просматриваются).
   ' Возвращает коллекцию, содержащую полные пути найденных файлов
   ' (применяется рекурсивный вызов процедуры GetAllFileNamesUsingFSO)
 
    Set FilenamesCollection = New Collection    ' создаём пустую коллекцию
   Set FSO = CreateObject("Scripting.FileSystemObject")    ' создаём экземпляр FileSystemObject
   GetAllFileNamesUsingFSO FolderPath, Mask, FSO, FilenamesCollection, SearchDeep ' поиск
   Set FSO = Nothing: Application.StatusBar = False    ' очистка строки состояния Excel
End Function
 
Function GetAllFileNamesUsingFSO(ByVal FolderPath As String, ByVal Mask As String, ByRef FSO, _
                                 ByRef FileNamesColl As Collection, ByVal SearchDeep As Long)
    ' перебирает все файлы и подпапки в папке FolderPath, используя объект FSO
   ' перебор папок осуществляется в том случае, если SearchDeep > 1
   ' добавляет пути найденных файлов в коллекцию FileNamesColl
   On Error Resume Next: Set curfold = FSO.GetFolder(FolderPath)
    If Not curfold Is Nothing Then    ' если удалось получить доступ к папке
 
        ' раскомментируйте эту строку для вывода пути к просматриваемой
       ' в текущий момент папке в строку состояния Excel
        'Application.StatusBar = "Поиск в папке: " & FolderPath
 
        For Each fil In curfold.Files    ' перебираем все файлы в папке FolderPath
           If fil.Name Like "*" & Mask Then FileNamesColl.Add fil.Path
        Next
        SearchDeep = SearchDeep - 1    ' уменьшаем глубину поиска в подпапках
       If SearchDeep Then    ' если надо искать глубже
           For Each sfol In curfold.SubFolders    ' перебираем все подпапки в папке FolderPath
               GetAllFileNamesUsingFSO sfol.Path, Mask, FSO, FileNamesColl, SearchDeep
            Next
        End If
        Set fil = Nothing: Set curfold = Nothing    ' очищаем переменные
   End If
End Function
 
Sub ChangeFolder()    ' для отдельной кнопки - если вдруг надо поменять ранее выбранную папку
   On Error Resume Next: GetFolder , True
End Sub
Function GetFolder(Optional ByVal FolderIndex& = 0, Optional ByVal ShowDialog As Boolean = False, _
                   Optional ByVal Title$ = "Выберите папку", Optional ByVal InitialFolder$) As String
    ' При первом вызове выводит диалогое окно выбора папки
   ' Запоминает выбранную папку, и при следующих вызовах диалоговое окно не выводит,
   ' а возвращает путь к ранее выбиравшейся папке
   ' Используйте вызов с параметром ShowDialog=TRUE для принудительного отображения диалогового окна
   On Error Resume Next: Err.Clear
    ProjectName$ = IIf(Len(PROJECT_NAME$) > 0, PROJECT_NAME$, "SelectFolder")
    PreviousFolder$ = GetSetting(Application.Name, ProjectName$, "folder" & FolderIndex&, "")
    If Len(PreviousFolder$) > 0 And Not ShowDialog Then
        If Dir(PreviousFolder$, vbDirectory) <> "" Then GetFolder = PreviousFolder$: Exit Function
    End If
 
    If InitialFolder$ = "" Then
        If Len(PreviousFolder$) > 0 And Dir(PreviousFolder$, vbDirectory) <> "" Then
            InitialFolder$ = PreviousFolder$    ' начинаем обзор с ранее выбранной папки
       Else
            InitialFolder$ = ThisWorkbook.Path & ""    ' начинаем с текущей папки
       End If
    End If
 
    With Application.FileDialog(msoFileDialogFolderPicker)    ' вывод диалогового окна
       .ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialFolder$
        If .Show <> -1 Then Exit Function    ' если пользователь отказался от выбора папки
       GetFolder = .SelectedItems(1)
        If Not Right$(GetFolder, 1) = "" Then GetFolder = GetFolder & ""
        SaveSetting Application.Name, ProjectName$, "folder" & FolderIndex&, GetFolder
    End With
End Function
 
Sub Otd()
On Error Resume Next: Err.Clear
    Dim AskForFolder As Boolean: AskForFolder = 1
    'Not shd.OLEObjects("SaveFolderPath").Object.Value
 
    ' запрашиваем пути к папкам с файлами
    msg1 = "Выберите папку с файлами "
    InvoiceFolder$ = GetFolder(1, AskForFolder, msg1)
    If InvoiceFolder$ = "" Then MsgBox "Не указан папка с файлами", vbCritical, "выполнить макрос невозможно": Exit Sub
 
    Dim coll As Collection
    ' загружаем список файлов по маске имени файла
    Set coll = FilenamesCollection(InvoiceFolder$, "*.xls*", 1)
 
    If coll.Count = 0 Then
        MsgBox "Нет ни одного файла в папке" & vbNewLine & InvoiceFolder$, _
               vbExclamation, "ВНИМАНИЕ!!!"
        Exit Sub
    End If
    
        Dim wB As Workbook, sh As Worksheet, ra As Range
    Application.ScreenUpdating = False  ' отключаем обновление экрана (чтобы процесс открытия файлов не был виден)
 
    ' перебираем все найденные в папке файлы
    For Each Filename In coll
 
       ' открываем очередной файл в режиме «только чтение»
        Set wB = Nothing: Set wB = Workbooks.Open(Filename, False, False)
 
        If wB Is Nothing Then    ' не удалось открыть файл
            pi.Log vbTab & "Ошибка загрузке файла. Файл не сделан."
 
        Else    ' файл успешно открыт
 
'------Start
 
Set WS1 = ActiveWorkbook
Set wB = GetAnotherWorkbook
Application.ScreenUpdating = False
 
With WS1.Sheets("Ресурси")
Lr = .Cells(Rows.Count, 1).End(xlUp).Row
a = .Range("A1:A" & Lr).Value
Set sd = CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(a)
        sd.Item(a(i, 1)) = ""
    Next
    
For i = 5 To wB.Sheets("Ресурси").Cells(Rows.Count, 1).End(xlUp).Row
    If Not sd.Exists(wB.Sheets("Ресурси").Cells(i, 1).Value) Then
        sd.Item(wB.Sheets("Ресурси").Cells(i, 1).Value) = ""
        Lr = Lr + 1
        .Cells(Lr, 1) = wB.Sheets("Ресурси").Cells(i, 1)
        .Cells(Lr, 2) = wB.Sheets("Ресурси").Cells(i, 2)
        .Cells(Lr, 3) = wB.Sheets("Ресурси").Cells(i, 3)
    End If
Next
End With
        
ActiveWorkbook.Save
ActiveWorkbook.Close
 
'------Stop
        
        End If
    Next
 
    ' включаем обновление экрана
    Application.ScreenUpdating = True
    
    MsgBox "Файлы сделаны", vbInformation
     
End Sub
1
0 / 0 / 0
Регистрация: 25.03.2022
Сообщений: 1
29.03.2022, 00:51
Подскажите пожалуйста, а если есть совпадения из листа1 столбец А и в листе2 столбец А, как внести данный из Лист1 столбец Б в лист 2 Столбец С ?

Добавлено через 3 часа 50 минут
спасибо разобрался ))))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.03.2022, 00:51
Помогаю со студенческими работами здесь

Сравнение ячейки со столбцом в Excel
на листе &quot;Сводка&quot; в столбце &quot;А&quot; номенклатуры товара, который есть в принципе. на листе &quot;Foto&quot; в столбце &quot;А&quot;...

Сравнение дат и вывод диапазона в ячейки
Добрый день. Сижу разбираюсь тут с основами VBA Excel. Прилетела задача на работе. В общем смысл такой: нужно написать программу, которая...

сравнение с массивом
у меня есть массив определенных слов и мне нужно одно проверить слово не совпадает ли оно с каким нибудь словом из массива, сделал вот так ...

Сравнение с массивом
Как сравнить данные и проверить если не равно в масcиве, чтобы убрать else $ipadmin=$_SERVER; ...

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Old Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru