Vba Excel: использование условия ИЛИ столбца без дублирования строки

325
ExcelNovice

Это обновленная версия для этого .

Вышеупомянутое решение хорошо, пока я не понял, когда я помещаю большие данные, цикл for генерирует дублирующиеся строки (что приводит к нежелательным результатам)

Я нашел какой-то метод в Интернете, чтобы удалить дубликаты строк.

ActiveSheet.Range ("A: F"). RemoveDuplicates Столбцы: = 1, Заголовок: = xlNo

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

Моя ЛОГИКА вызывает дубликаты?

Позвольте мне привести пример для моей проблемы сейчас,

code name description status  4566 Adam al active 

Так как Адам совпадает, а также активен, я получаю 4566; запись.
Но по моей логике я получаю еще 4566.

Спасибо. Будем благодарны за любые советы по функции / методу или коду.

РЕДАКТИРОВАТЬ
код является уникальным значением в этой группе данных. У меня есть Xsheet, где оба столбца независимы и неравномерны, но без дубликатов (этот лист является динамическим).

  • Sheet1 - это оригинальные сгенерированные данные, динамическая база данных.
  • И Xsheet, и Sheet1 являются случайными данными, которые не отсортированы.

Что я пытаюсь сделать

Если имя или описание в основном списке (Xsheet) найдено в листе данных (Sheet1) и оно также является активным, скопируйте его на новый лист без дубликатов (того же кода для Sheet2). Поскольку у некоторого кода было соответствующее Имя, также Описание.

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

Это Xsheet.

name description Adam al Edward dc Rose tp Jen  Owen  Jack  Belle  Sally  Cindy  Max  Zack  Moon  Shawn  

Это Лист1.

code operation title date name description status 4566 Adam ttr active 4899 Edward ttp inactive 4987 Adam dc active 4988 Kris al active 4989 Chris ttr inactive 5713 Mary rt active 5312 Ken active 3211 John active 2138 Summer active 3334 Wendy active 5417 Adam active 3355 Belle active 4773 Adam active 3288 Ron inactive 1289 Wincy dc active 

Это VBA.

Sub Procedure2()  Dim xsht As Worksheet Dim sht As Worksheet 'original sheet Dim newsht As Worksheet 'sheet with new data  Application.ScreenUpdating = False  Set xsht = ThisWorkbook.Worksheets("Xsheet") Set sht = ThisWorkbook.Worksheets("Sheet1") Set newsht = ThisWorkbook.Worksheets("Sheet2")  Set main = xsht.Range("A1") Set dat = sht.Range("A1") Set newdat = newsht.Range("A1")  'initialise counters Dim i, j, iRow As Integer 'instantiate and initialize the integers i = 1 j = 1 iRow = 1  'set heading on sheet2 newdat.Offset(0, 0).Value = dat.Offset(0, 0).Value 'copy code newdat.Offset(0, 1).Value = dat.Offset(0, 2).Value 'copy title newdat.Offset(0, 2).Value = dat.Offset(0, 3).Value 'copy date newdat.Offset(0, 3).Value = dat.Offset(0, 4).Value 'copy name newdat.Offset(0, 4).Value = dat.Offset(0, 5).Value 'copy descr newdat.Offset(0, 5).Value = dat.Offset(0, 6).Value 'copy status  Do While main.Offset(i, 0).Value <> "" Or main.Offset(i, 1).Value <> ""  j = 1 'reset DataSheet pointer  Do While dat.Offset(j, 0).Value <> ""  If (main.Offset(i, 0).Value = dat.Offset(j, 4).Value _ Or main.Offset(i, 1).Value = dat.Offset(j, 5).Value) _ And dat.Offset(j, 6).Value = "active" Then  newdat.Offset(iRow, 0).Value = dat.Offset(j, 0).Value 'copy code newdat.Offset(iRow, 1).Value = dat.Offset(j, 2).Value 'copy title newdat.Offset(iRow, 2).Value = dat.Offset(j, 3).Value 'copy date newdat.Offset(iRow, 3).Value = dat.Offset(j, 4).Value 'copy name newdat.Offset(iRow, 4).Value = dat.Offset(j, 5).Value 'copy descr newdat.Offset(iRow, 5).Value = dat.Offset(j, 6).Value 'copy status iRow = iRow + 1 End If j = j + 1 'increment DataSheet pointer; fast moving; changing/resetting Loop  i = i + 1 'increment XSheet pointer; slow moving outer loop; not resetting Loop  Application.ScreenUpdating = True  End Sub 
1
Комментарии не для расширенного обсуждения; этот разговор был [перемещен в чат] (http://chat.stackexchange.com/rooms/57803/discussion-on-question-by-excelnovice-vba-excel-using-or-column-condition-with). Journeyman Geek 7 лет назад 0
@JourneymanGeek Спасибо. Я тоже думал об этом, но в то время у ОП не было достаточно «очков» для общения в чате. ejbytes 7 лет назад 0
Пожалуйста, не забудьте принять решение. ejbytes 7 лет назад 0

1 ответ на вопрос

1
ejbytes

Это предложение, которое вы подытожили мою ситуацию в прошлый раз.
«Если имя или описание в основном списке найдено в листе данных и оно также является активным, скопируйте его на новый лист».

Sub check_listX()  'Set dat = sht.Range("code").Cells(1,1) Set main = ThisWorkbook.Worksheets("Xsheet").Range("A1") Set dat = ThisWorkbook.Worksheets("Sheet1").Range("A1") Set newdat = ThisWorkbook.Worksheets("Sheet2").Range("A1")  'initialise counters Dim i, j, iRow As Integer 'instantiate and initialize the integers i = 1 j = 1 iRow = 1  'set heading on sheet2 newdat.Offset(0, 0).Value = dat.Offset(0, 0).Value 'copy code newdat.Offset(0, 1).Value = dat.Offset(0, 2).Value 'copy title newdat.Offset(0, 2).Value = dat.Offset(0, 3).Value 'copy date newdat.Offset(0, 3).Value = dat.Offset(0, 4).Value 'copy name newdat.Offset(0, 4).Value = dat.Offset(0, 5).Value 'copy descr newdat.Offset(0, 5).Value = dat.Offset(0, 6).Value 'copy status  Do While main.Offset(i, 0).Value <> "" Or main.Offset(i, 1).Value <> ""  j = 1 'reset DataSheet pointer  Do While dat.Offset(j, 0).Value <> ""  If dat.Offset(j, 6).Value = "active" _ And main.Offset(i, 0) = dat.Offset(j, 4) _ Or main.Offset(i, 1) = dat.Offset(j, 5) _ And dat.Offset(j, 5) <> "" Then  newdat.Offset(iRow, 0).Value = dat.Offset(j, 0).Value 'copy code newdat.Offset(iRow, 1).Value = dat.Offset(j, 2).Value 'copy title newdat.Offset(iRow, 2).Value = dat.Offset(j, 3).Value 'copy date newdat.Offset(iRow, 3).Value = dat.Offset(j, 4).Value 'copy name newdat.Offset(iRow, 4).Value = dat.Offset(j, 5).Value 'copy descr newdat.Offset(iRow, 5).Value = dat.Offset(j, 6).Value 'copy status iRow = iRow + 1 End If j = j + 1 'increment DataSheet pointer; fast moving; changing/resetting Loop  i = i + 1 'increment XSheet pointer; slow moving outer loop; not resetting Loop End Sub 
@ExcelNovice Добро пожаловать! ejbytes 7 лет назад 0

Похожие вопросы