1

У меня есть этот рабочий лист, который содержит столбцы «код, операция, заголовок, дата, имя, описание, статус». Формат все в общем.

code:4566, 4899, 4987, 4988, 4989  
operation:X,Y,Z,X,Y  
title:XX,YY,ZZ,RR,XXY  
date: (the date column is not blank)  
name:Adam,Edward,Adam,Kris,Chris  
description: (some rows has data for this column, some are blank)  
status: active, inactive, closed

Я пытаюсь скопировать строки, в столбце "имя" которых есть "Адам" или "Эдвард" И столбец "статус" и "активно", на новый лист, содержащий столбцы «код, заголовок, дата, имя, описание, статус». (Я не хочу столбец "операция" на новом листе)

на данный момент, я не против, если некоторые из моих ячеек описания в строках пусты. Я все еще хочу это в результатах.

к концу возвращаемые значения будут только 2 ряда: 4566 и 4987
Я мог бы сделать это вручную. Но я хочу попробовать, если это возможно сделать VBA одним щелчком мыши (процесс автоматизации)

Спасибо.

P/S: прошу прощения за не включая то, что у меня есть сейчас, вот оно

Options Explicit

Sub Button1_Click()

Dim myRow As Long 'for finding last row  
Dim xlast As Integer 'x is the last row  
Dim sht As Worksheet 'original sheet  
Dim newsht As Worksheet 'sheet with new data  

Set sht = ThisWorkbook.Worksheets("Sheet1")  
Set newsht = ThisWorkbook.Worksheets("Sheet2")

myCol = code  
xlast = sht.Cells(Rows.Count, myCol).End(xlUp).Row  
'go through my code column for non-blank

For x = 1 To xlast 'from 1st row till last row  
(tab)    If (sheet.name.Cells() = "Adam" OR "Edward") And (sheet.status.Cells() = "active")  
(tab)    Then newsht.Rows.Value(code,title,date,name,description,status) = sheet.Rows().Value(code,title,date,name,description,status)  
    End If  
Next

End Sub

1 ответ1

0

Есть несколько проблем с вашим примером кода:

sheet.name.Cells() = "Адам" ИЛИ "Эдвард"

  • вам нужно проверять одну ячейку за раз, а не ячейки ()
  • чтобы ссылаться на значение ячейки, вам нужно сослаться на свойство ячейки Value, т.е. sheet.range (). value = "Adam"
  • каждое сравнение (Адам или Эдвард) должно оцениваться отдельно, то есть range (). value = "Adam" ИЛИ range (). value = "Edward"

newsht.Ряды.Значение (код, название, дата, название, описание, статус)

  • Значение не принимает именованные диапазоны, как это
  • этот код не использует итератор i, чтобы сказать, в какую строку копировать данные в sheet2

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

Sub macro2()

Set sht = ThisWorkbook.Worksheets("Sheet1")
Set newsht = ThisWorkbook.Worksheets("Sheet2")
'Set dat = sht.Range("p9")
Set dat = sht.Range("code").Cells(1, 1)
Set newdat = newsht.Range("c2")

'initialise counters
i = 1
j = 1

'set headings on sheet 2
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 dat.Offset(i, 0).Value <> "" 'loop till code data goes blank
  If ((dat.Offset(i, 4).Value = "Adam" Or dat.Offset(i, 4).Value = "Edward") And dat.Offset(i, 6).Value = "active") Then 'check conditions
    newdat.Offset(j, 0).Value = dat.Offset(i, 0).Value 'copy code
    newdat.Offset(j, 1).Value = dat.Offset(i, 2).Value 'copy title
    newdat.Offset(j, 2).Value = dat.Offset(i, 3).Value 'copy date
    newdat.Offset(j, 3).Value = dat.Offset(i, 4).Value 'copy name
    newdat.Offset(j, 4).Value = dat.Offset(i, 5).Value 'copy descr
    newdat.Offset(j, 5).Value = dat.Offset(i, 6).Value 'copy status
    j = j + 1
  End If

  i = i + 1
Loop


End Sub

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .