powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сравнение двух столбцов
26 сообщений из 26, показаны все 2 страниц
Сравнение двух столбцов
    #34426380
Добрый день.Подскажите, пожалуйста.
Есть 2 столбца в Excel. необходимо сравнить 2 столбца. Числа в столбце 2 не повторяются - если число из 1 столбца совпадает с числом из столбца 2, то должна появиться надпись "1" в третьем столбце. Написала программу, но она не работает. Подскажите, пожалуйста, где я ошибаюсь. Заранее спасибо.

Sub Совпадения()
Dim н_строки As Integer, н_столбца As Integer, строка As Integer
н_строки= ActiveCell.Row
н_столбца=ActiveCell.Column
строка=Cells (строка,10)
Set ячейка=ActiveSheet.Cells(н_строки,н_столбца)
Set ячейка1=Cells(строка,10)
Do While тек_ячейка.Value<>""
Do While тек_ячейка1.Value<>""
If ячейка1.Value=ячейка.Value Then
Cells (н_строки,11)="1"
End If
строка=строка+1
Set ячейка1=Cells(строка,10)
Loop
н_строки=н_строки+1
Set ячейка=ActiveSheet.Cells(н_строки,н_столбца)
Loop
End Sub
...
Рейтинг: 0 / 0
Сравнение двух столбцов
    #34426619
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
надо один столбец занести в массив ( с первой до последней строчки )
затем
читаешь столбец второй и ищешь соответствие в массиве
...
Рейтинг: 0 / 0
Сравнение двух столбцов
    #34426789
Мне кажется, что я именно это и сделала.
Проверяю каждую строку первого столбца до совпадения со строкой второго столбца. А затем затем перехожу к следующей строке первого столбца.
У меня выдает ошибку на строке
строка=Cells (строка,10)
...
Рейтинг: 0 / 0
Сравнение двух столбцов
    #34426870
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
Sub Макрос1()
Application.ScreenUpdating = False
Dim bb( 1000 )
For i = stroka1 To stroka999
    bb(i) = Range("B" & CStr(i)).Value               ' номенклатурный номер
Next

r =  0 
i =  0 
For i = ctpoka1 To ctroka99999
    r = r +  1 
    a0 = Range("A" & CStr(i)).Value       ' номенклатурный номер ИЗ ДРУГОЙ КОЛОНКИ
        For x = stroka1 To stroka999
            If a0 = bb(x) Then
                Range("D" & LTrim(Str(x))).Value =  1  ' ЕЖЕЛИ СРАВНИЛОСЬ
                Exit For
            End If
        Next
    End If
Next
MsgBox "прочитал " & LTrim(Str(r)) & " записей"
Application.ScreenUpdating = True
Exit Sub
Err0:
    Application.ScreenUpdating = True
    MsgBox Err.Description & vbCrLf & "на строке   " & Str(i)
End Sub
потом фильтр по колонке D
...
Рейтинг: 0 / 0
Сравнение двух столбцов
    #34427086
Спасибо за помощь. Но теперь мне выдает ошибку в строке

bb(i) = Range("B" & CStr(i)).Value ' номенклатурный номер
...
Рейтинг: 0 / 0
Сравнение двух столбцов
    #34427208
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл
Код: plaintext
1.
Sub Макрос1()
    On Error GoTo Err0
Макрос1 сообщит на какой строке ( в информации, т.е. Лист1 ) сидит ошибка
а переменным stroka1, stroka999, ctpoka1, ctpoka99999 укажи конкретные значения
например
Код: plaintext
1.
stroka1 =  5 
stroka999 =  1098  
возможно придётся написать проверку, когда узнаешь на какой строчке Листа1 сидит ошибка
например
Код: plaintext
1.
2.
if i =  578  Then
   Debug.Print "здесь будет точка остановки "
End If
в этом месте машина остановится, и ты посмотришь на значения других переменных
возможно там пустое значение, чего VB и Access не любят
возможно тип значения надо определить.
...
Рейтинг: 0 / 0
Сравнение двух столбцов
    #34428148
Фотография Дадахан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чего то не допру, вчем запарка?
sub CheckThis()
for i=acitvecell.row to 10000
if cells(i,2).value="" then exit for
for t=activecell.row to 10000
if cells(t,2).value="" then exit for
if cells(t,1).value=cells(i,2).value then cells(t,3).value=1
next t
next i
end sub 'или не так
...
Рейтинг: 0 / 0
Сравнение двух столбцов
    #34428344
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В таких случаях, если есть зуд использовать именно циклы (никогда не понимал, почему к ним такая тяга: один из самых неэффективных способов), то хоть применяйте ж функции Find / FindNext. Но тоже самое можно сделать одним выстрелом через ADO/XML, а говоря просто - с помощью SQL запросов, т.е. примитивных и старых SELECT/FROM/WHERE.
...
Рейтинг: 0 / 0
Сравнение двух столбцов
    #34428808
Фотография Дадахан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnВ таких случаях, если есть зуд использовать именно циклы (никогда не понимал, почему к ним такая тяга: один из самых неэффективных способов), то хоть применяйте ж функции Find / FindNext. Но тоже самое можно сделать одним выстрелом через ADO/XML, а говоря просто - с помощью SQL запросов, т.е. примитивных и старых SELECT/FROM/WHERE.
ты видел хоть один код без использования цикла? может ты путаешь с goto?
а как ты собераешься с Find/FindNext перебирать 2 колонку с уникальными данными?
да и напомни пожалуйста, чего то я забыл, как/куда можно написать запрос для данного топика в проекте ВБА для активной книги?
может мы ненароком ошиблись форумом? :)
...
Рейтинг: 0 / 0
Сравнение двух столбцов
    #34431514
Granata005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВПР - хорошая формула...
...
Рейтинг: 0 / 0
Сравнение двух столбцов
    #34431916
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
" ...ты видел хоть один код без использования цикла? может ты путаешь с goto?
а как ты собераешься с Find/FindNext перебирать 2 колонку с уникальными данными?
да и напомни пожалуйста, чего то я забыл, как/куда можно написать запрос для данного топика в проекте ВБА для активной книги?
может мы ненароком ошиблись форумом? :)..."


Привет, москоу!

Отвечаю по порядку. Да, видел. Более того, ты его тоже сейчас увидишь. Циклы и goto я не путаю с 1976 года, с тех пор, как я с ними познакомился. Перебор с Find ты можешь найти в моих примерах на форуме Relib.com. И, наконец, напоминаю забывчивым, куда можно написать SQL запрос в проекте ВБА для активной книги: в модуль, в класс модуль, в лист, в форму.

А теперь смотри, как его писать на примере модуля.

1. В листе Sheet1 в колонку А впиши все числа от 1 до 10. В колонку В впиши все нечетные числа от 1 до 19. Заполненный таким образом ранг назови Table.

2. На этот лист посади кнопку. Для этого листа скопируй этот код:

Option Explicit

Private Sub CommandButton1_Click()
DumpResults "D", "Sheet1", "F1", "F2", "C:\Temp\Table.XML"
DumpResults "E", "Sheet1", "F2", "F1", "C:\Temp\Table.XML"
End Sub

Private Sub DumpResults(ByVal pstrOutputRangeAddress As String, _
ByVal pstrOutputWshtName As String, _
ByVal pstrFieldOne As String, _
ByVal pstrFieldTwo As String, _
ByVal pstrFileXML As String)

Dim strSQL As String
Dim strFileXML As String

ThisWorkbook.Worksheets(pstrOutputWshtName).Range(pstrOutputRangeAddress & "1:" & pstrOutputRangeAddress & "65536").Clear

strSQL = "SELECT A." & pstrFieldOne & " FROM [Table] A WHERE NOT EXISTS (SELECT B." & pstrFieldTwo & " FROM [Table] B WHERE B." & pstrFieldTwo & " = A." & pstrFieldOne & ")"
strFileXML = "C:\Temp\Table.XML"
BuildMyXMLRecordset strSQL, strFileXML
ReadMyXMLData pstrOutputWshtName, pstrOutputRangeAddress & "1", strFileXML

End Sub

3. Создай модуль и в него скопируй этот код:

Option Explicit

Sub BuildMyXMLRecordset(ByVal pstrSQL As String, ByVal pstrFileXML As String)
Dim objMyRcrdst As ADODB.Recordset
Dim objMyStream As ADODB.Stream
Dim strCnctn As String

strCnctn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & ";" & _
"Extended Properties=""Excel 8.0;HDR=No"";"

Set objMyRcrdst = New ADODB.Recordset
Set objMyStream = New ADODB.Stream

With objMyRcrdst

.CursorLocation = adUseClient
.Open pstrSQL, strCnctn, adOpenStatic, adLockReadOnly, adCmdText
.Save objMyStream, adPersistXML
.Close
With objMyStream
.SaveToFile pstrFileXML, adSaveCreateOverWrite
.Close
End With
End With

Set objMyStream = Nothing
Set objMyRcrdst = Nothing

End Sub

Sub ReadMyXMLData(ByVal pstrWsht As String, ByVal pstrRangeAddress As String, ByVal pstrFileXML As String)
Dim objMyRcrdst As ADODB.Recordset
Dim strCnctn As String

Set objMyRcrdst = New ADODB.Recordset

strCnctn = "Provider=MSPersist;"

With objMyRcrdst
.CursorLocation = adUseClient
.Open pstrFileXML, strCnctn, adOpenStatic, adLockReadOnly, adCmdFile
Set .ActiveConnection = Nothing
End With

With ThisWorkbook.Worksheets(pstrWsht)
.Range(pstrRangeAddress).CopyFromRecordset objMyRcrdst
End With

objMyRcrdst.Close
ThisWorkbook.Worksheets(pstrWsht).Activate

Set objMyRcrdst = Nothing

End Sub

4. Кликни кнопку. В две колонке выйдут уникальные для первого и уникальные для второго значения полей ранга Table.

Успехов, москоу!
...
Рейтинг: 0 / 0
Сравнение двух столбцов
    #34432068
Фотография Дадахан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConn" ...ты видел хоть один код без использования цикла? может ты путаешь с goto?
а как ты собераешься с Find/FindNext перебирать 2 колонку с уникальными данными?
да и напомни пожалуйста, чего то я забыл, как/куда можно написать запрос для данного топика в проекте ВБА для активной книги?
может мы ненароком ошиблись форумом? :)..."


Привет, москоу!


Ну привет, Коннектикут!

VladConnОтвечаю по порядку. Да, видел. Более того, ты его тоже сейчас увидишь. Циклы и goto я не путаю с 1976 года, с тех пор, как я с ними познакомился.
блин, в понедельник такие посты, очень сложно переварить,особенно в конец рабочего дня.
Если я сказал "хоть один код без использования цикла" это не означает что "любой кусочек/модуль кода". Это означает проект в целом.
Ладно, на счет goto не горячись, я пошутил. хотя его я тоже использую иногда, но очень редко.
VladConnПеребор с Find ты можешь найти в моих примерах на форуме Relib.com.
обещаю обязательно заглянуть в свободное время. один х без цикла find/findnext не переберешь.

VladConn И, наконец, напоминаю забывчивым, куда можно написать SQL запрос в проекте ВБА для активной книги: в модуль, в класс модуль, в лист, в форму.

А теперь смотри, как его писать на примере модуля.
остальное поскипал заненадобностью.
т.е. ты предлагаешь в решении проблемы(вопроса) Марии Кондратович использовать XML?
вопрос: чем твое решения симпатичнее моего?
Я незнаю на сколько надо "иметь зуд" чтобы применить такое мамонтовское решение столь простого вопроса. с таким же успехом я могу и без XML решить данную задачу запросом используя напрямую коннект к этому xls файлу.

Успехов, Коннектикут!

P.S.
Хватит извращаться над XML'ом, он не для этого создан!
...
Рейтинг: 0 / 0
Сравнение двух столбцов
    #34432183
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет, Дадахан!

XML создан в частности и для таких вот вещей. Это совсем не извращение, этот подход взят мною из источников Microsoft, в которых он предлагался для решения задач вроде обсуждаемой здесь. Поэтому и я его предлагаю. Циклы как раз и есть мамонтово решение (ничего личного, ничего личного!) : из-за способа доисторического (перебор по одному, да безындексный!). Мое решение - очень простое, код то уже припасен, и я его за считанные минуты адаптировал, главным образом переписав сам запрос. Вы посмотрите: он же очень мал, но при этом гибок. И преимущество его очевидно на больших массивах данных. Вскоре вот новый Excel Microsoft обещает - до миллиона что-ли строк на листе. Так циклами там перебирать и перебирать. Тем мой пример и симпатичнее: на больших массивах его код гораздо быстрее. Но я ваш код не ругаю: он же работает. В конце концов, как говорят у нас в Коннектикуте, кота можно ободрать разными способами.

Так что не брезгуйте, пользуйте новые технологии, тем более, что вот он пример мой: берите его, он удобен, сколько раз спасал и меня и многих других форумчан. Да, данный пример и есть хоть маленький, но проект, не кусок.

Успехов

vladconn
...
Рейтинг: 0 / 0
Сравнение двух столбцов
    #34432187
Фотография Дадахан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnПеребор с Find ты можешь найти в моих примерах на форуме Relib.com.
не удержался. последние минуты потратил на поиск твоих постов. к сожалению не нашел кода с использованием findnext, кроме как советов по его использованию. однако в основном в твоих кодах применяется метод Do..Loop, что есть цикл. что же так зачесалось, что пришлось использовать цикл? ;) без обид, но перед постом с упреками нужно думать.
удачи.
...
Рейтинг: 0 / 0
Сравнение двух столбцов
    #34432215
Фотография Дадахан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnВскоре вот новый Excel Microsoft обещает - до миллиона что-ли строк на листе. Так циклами там перебирать и перебирать.
вот когда сие чудо выйдет в свет, что не очень скоро, то тогда милости просим новым технологиям.

Всего доброго.
...
Рейтинг: 0 / 0
Сравнение двух столбцов
    #34432265
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дадахан, Find/FindNext подразумевает циклы! Я об этом и писал, что если циклы, то тогда хорошо с Find/FindNext (или что-то одно из них по потребности). Никто и не советовал от них совершенно отказываться.

У меня ощущение, что вместо диалога по сути, все вращается вокруг некоего ущемленного самолюбия. Хорошо, если будет время, я попробую сам найти.

А касательно миллиона строк - что-то слишком обидчиво вы среагировали, что бы вы не сказали. Очень чувствуется. Ну попробуйте для начала на 60,000 строках. Но миллион - не за горами. Я бы смотрел вперед, а не в 1976 год. Да, если мой первый пост был воспринят как упрек, то я прошу прощения, я не желал вас или кого-то упрекать.

Успехов

vladconn
...
Рейтинг: 0 / 0
Сравнение двух столбцов
    #34432371
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, кстати, совсем простой пример без всяких циклов как раз для Марии Кондратович. Он подразумевает заполненными до десятой строки колонки А и В:

Private Sub CommandButton1_Click()
FindDiffs 10, "Sheet1"
End Sub


Private Sub FindDiffs(ByVal plngLastRow As Long, ByVal pstrWsht As String)
Dim objRange As Range

Set objRange = ThisWorkbook.Worksheets(pstrWsht).Range("C1:C" & CStr(plngLastRow))

With objRange
.FormulaArray = "=IF(RC[-2]:R[" & CStr(plngLastRow - 1) & "]C[-2]=RC[-1]:R[" & CStr(plngLastRow - 1) & "]C[-1],1,"""")"
End With

End Sub

Так что тут нет ни циклов, ни Find/FindNext, ни XML. И волки сыты, и овцы целы.

:о)))

vladconn
...
Рейтинг: 0 / 0
Сравнение двух столбцов
    #34432928
Фотография Дадахан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnВот, кстати, совсем простой пример без всяких циклов как раз для Марии Кондратович. Он подразумевает заполненными до десятой строки колонки А и В:

...
With objRange
.FormulaArray = "=IF(RC[-2]:R[" & CStr(plngLastRow - 1) & "]C[-2]=RC[-1]:R[" & CStr(plngLastRow - 1) & "]C[-1],1,"""")"
End With
...
Так что тут нет ни циклов, ни Find/FindNext, ни XML. И волки сыты, и овцы целы.

:о)))

vladconn
супер, слов нет. тоже метод решения задачи. только вот жаль, что при 60000 строк он уж очень будет тормозить систему, но для решения этой задачи вполне сойдет :)
...
Рейтинг: 0 / 0
Сравнение двух столбцов
    #34434419
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дадахан,

Спасибо за комплимент.

Единственная маленькая поправка: это ваш метод сильно тормозит систему на 60,000 строках, а мой метод исполняется практически мгновенно. У меня: за 0.31 сек, а цикл ваш: за черт знает сколько (жду уже минуту, Excel не реагирует, черт, связался таки с вашим кодом, ведь знал). Вот: прождал 5 минут и прервал. Да, я взял ваш код как есть. Он к тому же еще был и с ошибкой! Ну и ну!

Да, а прямое же заполнение единицами взяло больше 9 секунд.

:0))
...
Рейтинг: 0 / 0
Сравнение двух столбцов
    #34434649
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О, прелесть. Вот этот ваш "код"

sub CheckThis()
for i=acitvecell.row to 10000
if cells(i,2).value="" then exit for
for t=activecell.row to 10000
if cells(t,2).value="" then exit for
if cells(t,1).value=cells(i,2).value then cells(t,3).value=1
next t
next i
end sub

таки не работает. Так что я беру свои слова обратно о том, что ваш код якобы работает. Или вы имели ввиду какой-то другой код? Мол публикую одно, а в голове держу другое?

:0)))
...
Рейтинг: 0 / 0
Сравнение двух столбцов
    #34434941
Фотография Дадахан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnО, прелесть. Вот этот ваш "код"

sub CheckThis()
for i=acitvecell.row to 10000
if cells(i,2).value="" then exit for
for t=activecell.row to 10000
if cells(t,2).value="" then exit for
if cells(t,1).value=cells(i,2).value then cells(t,3).value=1
next t
next i
end sub

таки не работает. Так что я беру свои слова обратно о том, что ваш код якобы работает. Или вы имели ввиду какой-то другой код? Мол публикую одно, а в голове держу другое?

:0)))
ух ты, я смотрю тебе заняться было нечем.
ну чтоже мне сказать на это, один из нас явно не понял задания. может расскажешь как понял его ты?
...
Рейтинг: 0 / 0
Сравнение двух столбцов
    #34434980
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне уже есть чем заняться. Да и сколько можно бисер-то метать.
...
Рейтинг: 0 / 0
Сравнение двух столбцов
    #34435020
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хватит господа. На личности переходить не нужно. Думаю Марии кондратович уже достаточно материала для решения проблемы и дабы упредить возможные негативные последствия, я топик закрою.


Magnus
...
Рейтинг: 0 / 0
Сравнение двух столбцов
    #34435023
Фотография Дадахан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnМне уже есть чем заняться. Да и сколько можно бисер-то метать.
может всетаки расскажешь задание, прежде чем говорить что чтото не работает?
...
Рейтинг: 0 / 0
Сравнение двух столбцов
    #34435179
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Magnus23]Хватит господа. На личности переходить не нужно. Думаю Марии кондратович уже достаточно материала для решения проблемы и дабы упредить возможные негативные последствия, я топик закрою.[quot]

Наконец, Magnus23! У вас тут картинка не видна что-то. Но на личности мы и не переходим. Я вот и на "вы" почти сразу стал обращаться, и извинялся, правда без взаимности. Бисер, одним словом. Ну код не лучший был представлен, обидно, я понимаю, чего уж. У меня у самого такое бывало не раз. В конце-концов я же дал два эффективно работающих примера. Так что вы правильно сказали, материала достаточно.

:о )))
...
Рейтинг: 0 / 0
Сравнение двух столбцов
    #34435665
Фотография Дадахан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Попросил же русским языком прекратить. Мне банить начинать?
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сравнение двух столбцов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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