Macro do Excel para copiar linhas com nome exclusivo na coluna A para wosksheets nomeadas

0

Eu sou um novato do Excel e gostaria de receber ajuda com uma macro que faz o seguinte.

Háumtotalde58genes(colunaA)com2entradasparacadagene.Aimagemmostraapenas4genes.

Aoexecutaramacro(pormeiodeumatecladeatalho),ousuárioserásolicitadoainserirumnúmerodeamostra(Sample1nesteexemplo)e,emseguida,alinhadecadageneserácopiadaemsuasrespectivasfolhas(jácriado).Osgenessãotodosnomeadoscomexclusividade.Emcadaumadasfolhasdegenes,onúmerodaamostradeveserpreenchidonacolunaA.

Não posso postar mais de 2 capturas de tela. As folhas dos outros genes devem conter as 2 linhas do gene com "Sample1" na coluna A.

Quando a macro terminar de copiar as linhas para as 58 folhas (para os 58 genes), ela deverá retornar à planilha de entrada e excluir os dados previamente colados. O usuário deve ter permissão para colar os dados para a próxima amostra, executar a macro, inserir o número da amostra quando solicitado e os dados do gene dessa amostra são copiados nas próximas 2 linhas de suas respectivas folhas de genes.

Existem dados para milhares de amostras serem baseadas em banco de dados, e espero obter uma macro que seja capaz de fazer isso.

Edit: O código agora (graças a Mrig) é o seguinte:

Sub Macro1()

Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual

Dim lastRow As Long, i As Long, currLastRow
    Dim ws As Worksheet, currWS As Worksheet
    Dim SampleID As String

    SampleIDform.Show

    Set ws = ThisWorkbook.Sheets("Input")
    lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row

    For i = 2 To ThisWorkbook.Worksheets.Count
        Set currWS = ThisWorkbook.Sheets(i)
        currLastRow = currWS.Cells(Rows.Count, "A").End(xlUp).Row + 1
        With ws.Range("A1", "D" & lastRow)
            .AutoFilter Field:=1, Criteria1:=currWS.Name
            .Offset(1, 0).Copy currWS.Range("A" & currLastRow)
            .AutoFilter
            Range("A" & currLastRow).Value = SampleID
        End With
    Next i

    ws.Range("A2", "D" & lastRow).ClearContents

    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic
End Sub

Private Sub OkButton_Click()
    SampleID = txtSampleID.Value
    Unload Me
End Sub

Eu adicionei na linha Range("A" & currLastRow).Value = SampleID ao loop with, mas não consigo incluir o SampleID em todas as planilhas da coluna A.

O que estou fazendo de errado?

    
por Ramani 27.05.2016 / 13:59

2 respostas

0

Isso deve fazer por você:

Suposições:
1. A folha de entrada é sua primeira planilha na pasta de trabalho em que você está trabalhando 2. folhas têm o cabeçalho Gene | Allele | Reads | Sequence

Sub DataToSheets()
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual

    Dim lastRow As Long, i As Long, currLastRow
    Dim ws As Worksheet, currWS As Worksheet

    Set ws = ThisWorkbook.Sheets("Input")
    lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row

    For i = 2 To ThisWorkbook.Worksheets.Count
        Set currWS = ThisWorkbook.Sheets(i)
        currLastRow = currWS.Cells(Rows.Count, "A").End(xlUp).Row + 1
        With ws.Range("A1", "D" & lastRow)
            .AutoFilter Field:=1, Criteria1:=currWS.Name
            .Offset(1, 0).Copy currWS.Range("A" & currLastRow)
            .AutoFilter
        End With
    Next i

    ws.Range("A2", "D" & lastRow).ClearContents

    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic
End Sub

Fizemos algumas alterações na resposta dada por @ user2140261 no link mencionado por @Sun nos comentários.

    
por 29.05.2016 / 12:50
0

Obrigado Mrig por todas as suas sugestões. Eu acho que resolvi meus problemas. Meu código é o seguinte:

Sub DataToSheets()

Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual

Dim lastRow As Long, i As Long, currLastRow
    Dim ws As Worksheet, currWS As Worksheet
    Dim SampleID As String

    Set ws = ThisWorkbook.Sheets("Input")
    lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row

    SampleID = InputBox("Key in Sample ID", "Sample ID")
    If (StrPtr(SampleID) = 0) Then
        MsgBox "You pressed cancel or [X]"
    ElseIf (SampleID = "") Then
        MsgBox "You did not enter anything"
    Else
    For i = 2 To ThisWorkbook.Worksheets.Count
        Set currWS = ThisWorkbook.Sheets(i)
        currLastRow = currWS.Cells(Rows.Count, "A").End(xlUp).Row + 1
        With ws.Range("A1", "D" & lastRow)
            .AutoFilter Field:=1, Criteria1:=currWS.Name
            .Offset(1, 0).Copy currWS.Range("A" & currLastRow)
            .AutoFilter
            currWS.Range("A" & currLastRow).Value = SampleID
            currWS.Range("A" & currLastRow + 1).Value = SampleID
        End With
    Next i
    End If
    ws.Range("A2", "D2" & lastRow).ClearContents

    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic
End Sub

Sub PasteValues()
'
' PasteValues Macro
'
' Keyboard Shortcut: Ctrl+r
'    
    On Error Resume Next

    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False

    Call DataToSheets

End Sub

Eu não consegui obter a entrada da forma de usuário reconhecida por algum motivo e, assim, recorri ao uso da maneira InputBox para obter a entrada do usuário. As linhas currWS.Range("A" & currLastRow).Value = SampleID e currWS.Range("A" & currLastRow + 1).Value = SampleID incluem o SampleID inserido na coluna A das 2 linhas copiadas da planilha de entrada, para cada folha de gene. Se existe uma maneira mais eficiente de fazer isso, por favor me avise.

Tudo o que o usuário precisa fazer é copiar os dados, abrir o arquivo do Excel e executar a tecla de atalho e, em seguida, inserir o SampleID na InputBox.

Obrigado a todos, especialmente Mrig !!

    
por 29.05.2016 / 18:23