Excel Vba (botão onclick)

1

Eu tenho esta planilha que contém colunas "código, operação, título, data, nome, descrição, status". O formato é todo em geral.

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

Eu estou tentando copiar linhas que sua coluna 'nome' tem "Adam" ou "Edward" E coluna 'status' com "ativo" para nova planilha que contém colunas "código, título, data, nome, descrição, status " só. (Eu não quero coluna 'operação' em nova planilha)

neste ponto, não me importo se algumas das minhas células de descrição em linhas estiverem vazias. Eu ainda quero isso nos resultados.

até o final os valores de retorno seriam apenas 2 linhas: 4566 e 4987
Eu poderia fazer isso manualmente. Mas eu quero tentar se poderia ser feito por vba com um clique (processo de automação)

Obrigado.

P / S: peça desculpas por não ter incluído o que eu tenho agora, aqui está

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
    
por ExcelNovice 14.03.2017 / 04:41

1 resposta

0

Existem alguns problemas com o seu código de exemplo:

sheet.name.Cells ()="Adam" OU "Edward"

  • você precisa verificar uma célula de cada vez, em vez de Células ()
  • para se referir ao valor da célula, você precisa se referir à propriedade Valor da célula, ou seja, sheet.range (). value="Adam"
  • cada comparação (Adam ou Edward) precisa ser avaliada separadamente, ou seja, range (). value="Adam" OU range (). value="Edward"

newsht.Rows.Value (código, título, data, nome, descrição, status)

  • O valor não recebe intervalos nomeados como este
  • este código não usa o iterador i para dizer qual linha copiar o dados para em sheet2

Experimente o código abaixo. Você pode atribuí-lo a um botão, se desejar. Você precisará alterar o intervalo dat e newdat para se adequar à sua planilha. A principal mudança do seu código é que offset é usado para percorrer as várias linhas e colunas (deslocamento do canto superior esquerdo do bloco de dados) para verificar cada linha de dados. Cada cheque ou cópia é codificado explicitamente.

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
    
por 15.03.2017 / 01:28