我有一张工作表,其中包含“代码、操作、标题、日期、名称、描述、状态”列。格式都是通用的。
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
我正在尝试将“名称”列包含“Adam”或“Edward”且“状态”列包含“active”的行复制到仅包含“代码、标题、日期、名称、说明、状态”列的新工作表中。(我不想在新工作表中出现“操作”列)
此时,我不介意行中的某些描述单元格是否为空。我仍然希望它出现在结果中。
最后返回的值只有 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
您的示例代码存在一些问题:
sheet.name.Cells() = “Adam” 或 “Edward”
- 您需要一次检查一个单元格,而不是 Cells()
- 要引用单元格的值,需要引用单元格的 Value 属性,即 sheet.range().value = "Adam"
- 每个比较(Adam 或 Edward)都需要单独评估,即 range().value = "Adam" OR range().value = "Edward"
newsht.Rows.Value(代码、标题、日期、名称、描述、状态)
- 值不接受这样的命名范围
- 此代码未使用迭代器我说将数据复制到 sheet2 中的哪一行
尝试以下代码。您可以根据需要将其分配给按钮。您需要更改范围数据和新数据以适合您的工作表。您的代码的主要变化是抵消用于遍历各个行和列(从数据块的左上角偏移)以检查每行数据。每个检查或副本都经过明确编码。
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