Tópicos relacionados a códigos VBA, gravação de macros, etc.
Por BrunoLuiel
#65930
Olá galera! Por gentileza, eu gostaria de limpar meu código, qual sugestão vocês dão? Veja que tenho uma estrutura de repetição entre colunas que não são contínuas então fiz vários "do Until", mas acredito que eu poderia reduzir para apenas um. O código funciona, tudo ok, mas gostaria de deixa-lo mais bonito.
Código: Selecionar todos
 Sub Replace ()

Linha = 2
LinFim = Range("A1").end(xlDown).Row

For Coluna = 145 To 147 'Trabalha colunas EO Á EQ
        Do Until Linha = LinFim
            If Sheets("XML txt").Cells(Linha, Coluna) = "" Then
                Linha = Linha + 1
            Else
                Sheets("XML txt").Cells(Linha, Coluna) = "'" & Sheets("XML txt").Cells(Linha, Coluna)
                Sheets("XML txt").Cells(Linha, Coluna).Replace What:=".", Replacement:=",", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
                Linha = Linha + 1
            End If
        Loop
    Linha = 2
    Next
        
    For Coluna = 151 To 152 'Trabalha colunas EU á EV
        Do Until Linha = LinFim
            If Sheets("XML txt").Cells(Linha, Coluna) = "" Then
                Linha = Linha + 1
            Else
                Sheets("XML txt").Cells(Linha, Coluna) = "'" & Sheets("XML txt").Cells(Linha, Coluna)
                Sheets("XML txt").Cells(Linha, Coluna).Replace What:=".", Replacement:=",", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
                Linha = Linha + 1
            End If
        Loop
    Linha = 2
    Next
    
    For Coluna = 555 To 565 'Trabalha colunas UI á US
        Do Until Linha = LinFim
            If Sheets("XML txt").Cells(Linha, Coluna) = "" Then
                Linha = Linha + 1
            Else
                Sheets("XML txt").Cells(Linha, Coluna) = "'" & Sheets("XML txt").Cells(Linha, Coluna)
                Sheets("XML txt").Cells(Linha, Coluna).Replace What:=".", Replacement:=",", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
                Linha = Linha + 1
            End If
        Loop
    Linha = 2
    Next
    

    Do Until Linha = LinFim
        If Sheets("XML txt").Cells(Linha, "WT") = "" Then
            Linha = Linha + 1
        Else
            Sheets("XML txt").Cells(Linha, "WT") = "'" & Sheets("XML txt").Cells(Linha, "WT")
            Sheets("XML txt").Cells(Linha, "WT").Replace What:=".", Replacement:=",", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
            Linha = Linha + 1
        End If
    Loop
    Linha = 2
End Sub
Por osvaldomp
#65934
Olá, @BrunoLuiel .

Experimente (não testado).
Código: Selecionar todos
Sub ReplaceV2()
 Dim Coluna As Variant, Linha As Long
  For Each Coluna In Array(145, 147, 151, 152, 555, 565) 'falta incluir a coluna WT
   For Linha = 2 To Range("A1").End(xlDown).Row
    If Sheets("XML txt").Cells(Linha, Coluna) <> "" Then
     Sheets("XML txt").Cells(Linha, Coluna) = "'" & Sheets("XML txt").Cells(Linha, Coluna)
     Sheets("XML txt").Cells(Linha, Coluna).Replace What:=".", Replacement:=",", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    End If
   Next Linha
  Next Coluna
End Sub
#
dicas:
1. no mínimo, habitue-se a declarar as variáveis
2. ideal, obrigue-se a declarar as variáveis ~~~> Ferramentas | Opções | Requerer declaração de variável
3. se a planilha ativa ao rodar o código for XML txt então não é necessário referenciá-la no código
4. talvez seja possível simplificar ainda mais o código e/ou aumentar a velocidade de execução, para isso precisamos ver a sua planilha. Se houver interesse então disponibilize diretamente aqui no fórum uma amostra do seu arquivo Excel com algumas linhas (máximo 10 a 15 linhas) representativas da situação antes de rodar o código e coloque o resultado desejado.
Por BrunoLuiel
#65956
Fiz o teste e deu certo, mas um detalhe, quando declaro o "in array", consigo fazer itervalos, pois por exemplo quero que seja da coluna 145 até coluna 147, partir da coluna 555 até a 565? Pergunto pois nos casos de itervalos grandes, que cabem sequencia eu vou ter que ficar fazendo: "For Each Coluna In Array(145,146, 147, 151, 152, 555, 556,557,558,559,560,561,562,563,564,565).
Por osvaldomp
#65961
Nesses casos utilize o formato abaixo.
Código: Selecionar todos
Sub ReplaceV3()
 Dim Coluna As Range, Linha As Long
  For Each Coluna In Range("A:E,G:G,J:M").Columns
  
   MsgBox Coluna.Column 'substitua a MsgBox pelo restante do código
   
  Next Coluna
End Sub
Bikke agradeceu por isso

Segue a planilha amigo, por favor, me ajude!!!

Existe alguma forma de contornar essa situa&cced[…]

Jonathaluis, bom dia! Primeiramente quero agradec[…]

Boa noite, caso alguém puder me ajudar fic[…]

Obrigado, Jonatha. Imagino que a fórmula n&[…]

Boa tarde, pessoal. Precisando de ajuda ou sugest[…]

Boas pessoal! Sou novo por aqui e tenho conhecimen[…]

@Vilmar estou usando a medida abaixo Valor Ul[…]