What we need is to export some data to another file type and keep the active document "our-real-data.xlsx".
CSV_tools.xla
Eu montei um rápido add-in do VBA que exporta como CSV desde que você o mencionou. Tentei usar o menor código possível para que novos usuários possam entendê-lo com mais facilidade.
O que isso faz
-
O
- add-in pergunta onde salvar o CSV. Pasta padrão é a pasta onde o XLS é salvo em
- O suplemento detecta automaticamente se uma vírgula ou ponto e vírgula devem ser usados como separador em relação às configurações do sistema regional
- Todos os valores da planilha do Excel atualmente ativa são exportados para um novo arquivo CSV que é nomeado após o arquivo XLS
- O XLS existente não é tocado de nenhuma forma
Instalação
- Faça o download do Add-In e salve-o em
C:\Users\%USERNAME%\AppData\Roaming\Microsoft\AddIns
- Abra o Excel e ative-o sob
- Excel 2003: Barra de menus → Ferramentas → Suplementos
- Excel 2007: Opções do Excel → Suplementos → Ir para
- Excel 2010-13: guia Arquivo → Opções → Suplementos → Ir para
-
Reinicie o Excel e observe sua barra de menus
códigoVBA
Function ExportCSV()
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
ChDrive (ActiveWorkbook.Path)
ChDir (ActiveWorkbook.Path)
strName = fso.GetBaseName(ActiveWorkbook.Name)
On Error GoTo 0
strFilename = Application.GetSaveAsFilename(strName, "CSV Files,*.csv", 1)
delimiter = Application.International(xlListSeparator)
If Not strFilename = False Then
Open strFilename For Append As #1
For Each rngRow In ActiveSheet.UsedRange.Rows
arr2D = rngRow
arr1D = Application.Index(arr2D, 1, 0)
strRow = Join(arr1D, delimiter)
Print #1, strRow
Next
Close #1
End If
End Function
Atualizações automáticas para diferentes usuários
Uma vez que cada usuário tenha ativado o Add-in em seu Excel (não pode ser automatizado), você pode copiar a nova versão do arquivo .xla
via compartilhamento de rede, Robocopy ou ferramentas similares. Mas esta deve ser uma questão separada, pois há muitas maneiras diferentes de resolver o problema.
Para os geeks do VBA, a parte mais interessante é
arr2D = rngRow
arr1D = Application.Index(arr2D, 1, 0)
strRow = Join(arr1D, delimiter)
que converte um intervalo (uma única linha no nosso caso) em um array 2D, depois em um array 1D e finalmente em uma única string usando a função Join ()