Converte um intervalo de linhas em uma lista separada por vírgula na área de transferência

1

Eu tenho alguns dados em uma planilha do Excel que preciso reformatar. O formato existente está em linhas. O formato desejado é separado por vírgulas.

Em outro lugar no superusuário eu encontrei um script VBA que me pega cerca de 75% do caminho ...

Converter uma coluna em uma lista separada por vírgula

Sub generatecsv() 

Dim i As Integer
Dim s As String

i = 1

Do Until Cells(i, 1).Value = ""
    If (s = "") Then
        s = Cells(i, 1).Value
    Else
        s = s & "," & Cells(i, 1).Value
    End If
    i = i + 1 
Loop

Cells(1, 2).Value = s

End Sub

As deficiências deste script para o fluxo de trabalho pretendido atualmente são:

O intervalo de células deve estar sempre na coluna 1. Preciso que o script receba entrada de um intervalo selecionado em qualquer lugar da planilha.

A saída do script sempre aparece em Cell (1,2). Eu gostaria de copiá-lo para a área de transferência.

Eu esperava que algo como s.Copy ou s.PutInClipboard funcionasse, mas estou recebendo erros.

Os dados são assim:

Topic 1
Mike
Tony
Dave


Topic 2 
Steve
Joe
Sally


Topic 3
...

A saída desejada seria:

Mike, Tony, Dave

(na área de transferência)

Em seguida, na próxima iteração:

Steve, Joe, Sally

(na área de transferência)

    
por AllInOne 24.10.2012 / 17:00

1 resposta

2

Primeiro, na pasta de trabalho que contém a macro, no IDE do VBA, vá para Ferramentas - > Referências e adicione a referência a "Microsoft Forms 2.0 Object Library" (o caminho do arquivo no meu sistema é C:\Windows\system32\FM20.DLL .)

Em seguida, tente esta macro. Essa macro colocará os dados "selecionados" (destacados) na área de transferência. Irá da esquerda para a direita se você selecionar uma série de células na mesma linha; ele vai de cima para baixo se você selecionar uma série de células na mesma coluna.

Se você precisa fazer um composto de linhas e colunas (uma seleção em forma de retângulo de mais de uma linha e mais de uma coluna), você pode adicionar código como:

MsgBox "Row: " & cell.Row & " Column: " & cell.Column

para determinar quais números de linha (com base em 1) e números de coluna (A = 1) estão sendo enumerados e em qual ordem.

Se você precisar de algo que coloque os dados na área de transferência, aguarde uma ação do usuário e, em seguida, coloque o próximo conjunto de dados na área de transferência automaticamente, essa macro precisará ser modificada. Não está claro a partir de sua pergunta o que exatamente você quer dizer com "selecionado".

Sub su492198()
Dim cell As Range
Dim sel As Range
Dim output As String
Dim first As Boolean
Dim dat As New DataObject

first = True
output = ""

On Error GoTo Errhndl
Set sel = Selection
On Error GoTo 0

For Each cell In sel.Cells
    If first = False Then output = output & ", "
    output = output & cell.Value
    first = False
Next

On Error GoTo Errclip
dat.SetText output
dat.PutInClipboard
On Error GoTo 0

Exit Sub
Errhndl:
MsgBox "Can't use this macro if nothing is selected or a non-cell object is selected"
Exit Sub
Errclip:
MsgBox "Error copying text to clipboard! Text was: " & output
End Sub
    
por 24.10.2012 / 17:17