j'ai besoin de créer une macro me permettant d'ouvrir automatiquement des fichiers CSV dont les données sont séparées horizontalement par des points-virgule.
Après quelques recherche, j'ai pu trouver la macro suivante:
Code : Tout sélectionner
REM ***** BASIC *****
'Copyright (c) 2007 Winfried Rohr, re-Solutions Software Test Engineering
'mailto: ooo@re-solutions.de Untere Zahlbacher Strasse 18, D-55131 Mainz
'This program is free software; you can redistribute it and/or modify it under
'the terms of the GNU General Public License as published by the Free Software
'Foundation; either version 2 of the License, or (at your option) any later
'version.
'This program is distributed in the hope that it will be useful, but WITHOUT
'ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
'FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
'You should have received a copy of the GNU General Public License along with
'this program; if not, write to the Free Software Foundation, Inc., 59 Temple
'Place, Suite 330, Boston, MA 02111-1307 USA
' ========================================================================
' Main routine
'
' 1. determine your CSV filter options and edit this
' 2. run insertCSV2Calc with your target calc open
Sub insertCSV2Calc
sMakroName = "insertCSV2Calc "
sMakroVersion = "1.4.2 " ' Niko plus ,4
'sMakroDatum = "20070615 "
'sMakroDatum = "20080202 " ' 1.4.1 CopyError calling function name
sMakroDatum = "20080711 " ' 1.4.2 typo "iiZeile"
oImport2Calc = StarDesktop.getCurrentComponent().getCurrentController().getModel()
' Prüfen, ob aus Calc aufgerufen
If NOT oImport2Calc.supportsService(_
"com.sun.star.sheet.SpreadsheetDocument" ) Then
MsgBox _
"Makro wurde nicht von einem Calc-Dokument aufgerufen. No CALC" & CHR(10) _
& CHR(10) & "Erklärung:" _
& CHR(10) & "Dieses Makro importiert eine CSV-Datei mit festen" _
& CHR(10) & "Filtereinstellungen nach Calc - es wurde aber nicht" _
& CHR(10) & "aufgerufen von einem Calc-Dokument" _
& CHR(10) _
& CHR(10) & "Makro " & sMakroName & " wird nun beendet." _
, 48 , sMakroName & "Version " & sMakroVersion
Exit Sub
' CALC SHEET HAS TO CALL THIS ROUTINE
End If
' laden von Hilfsfunktionen
GlobalScope.BasicLibraries.LoadLibrary( "Tools" )
' Dateidialog zur Auswahl des CSV
oFileDialog = _
CreateUnoService( "com.sun.star.ui.dialogs.FilePicker" )
With oFileDialog
.appendFilter( "Textdatei (TAB getrennt)", "*.csv" )
.Title = "CSV-Datei zum Import wählen"
' .setDisplayDirectory( ConvertToURL( "U:\Eigene Dateien\") )
.setDisplayDirectory( ConvertToURL( "U:\AALST\PDF\CA150") )
End With
' wenn ausgewählt und mit OK geschlossen
If oFileDialog.execute() = _
com.sun.star.ui.dialogs.ExecutableDialogResults.OK then
' ausgewählter Dateiname
sUrl = oFileDialog.Files(0)
' Tabellenblatt abfragen
sBlattName = Inputbox( "Name der Tabelle zum Einfügen", _
sMakroName & " -Tabellen-Name", "neuesteDaten" )
if sBlattName > "" then
' wenn vorhanden: nicht OK
if oImport2Calc.Sheets().hasByName( sBlattName ) then
MsgBox _
"Beende das Makro: Tabelle bereits vorhanden." & CHR(10) _
& CHR(10) & "Erklärung:" _
& CHR(10) & "Eine Tabelle mit dem eingegebenen Namen existiert " _
& CHR(10) & "Deshalb importiere ich die Daten nicht" _
& CHR(10) & "Makro " & sMakroName & " wird nun beendet." _
, 48 , sMakroName & "Version " & sMakroVersion
Exit Sub
End If
' nicht vorhanden: angelegen nach letztem Blatt
if oImport2Calc.Sheets().getCount() < 255 then
oImport2Calc.Sheets().insertNewByName( sBlattName , _
oImport2Calc.Sheets().getCount() )
else
MsgBox _
"Beende das Makro: Max. Tabellenanzahl." & CHR(10) _
& CHR(10) & "Erklärung:" _
& CHR(10) & "Diese Calc-Datei hat die maximale Anzahl an Tabellen" _
& CHR(10) & "Deshalb importiere ich die Daten nicht" _
& CHR(10) & "Makro " & sMakroName & " wird nun beendet." _
, 48 , sMakroName & "Version " & sMakroVersion
Exit Sub
End If
Else
msgbox "kein Tabellename bestimmt - Makro endet ohne Aktion" _
,, sMakroName & sMakroVersion
Exit Sub
End If
' Objekt für das neue Blatt
oNeuBlatt = _
oImport2Calc.Sheets().getByName( sBlattName )
' Filter festlegen
Dim FileProperties(1) As New com.sun.star.beans.PropertyValue
FileProperties(0).Name = "FilterName"
FileProperties(0).Value ="Text - txt - csv (StarCalc)"
FileProperties(1).Name = "FilterOptions"
' FilterOptions
FileProperties(1).Value ="59/44,34,ANSI,1,"
' Datei öffnen
oCSV = _
StarDesktop.loadComponentFromURL( _
sUrl, "_blank", 0, FileProperties())
' Bereich der Daten ermitteln
oQuellBlatt = oCSV.Sheets( 0 )
Dim iiSpalten as Long
Dim iiZeilen as Long
iiSpalten = _
iC2C_getLastUsedColumn( oQuellBlatt )
iiZeilen = _
iC2C_getLastUsedRow( oQuellBlatt )
' alle Daten als Array rausziehen
oQuellBereich = _
oQuellBlatt.getCellRangeByPosition( _
0, 0, iiSpalten, iiZeilen )
alleDaten = _
oQuellBereich.getDataArray()
' Zielbereich in gleicher Grösse festlegen
oZielBereich = _
oNeuBlatt.getCellRangeByPosition( _
0, 0, iiSpalten, iiZeilen )
' Datenarray reinschreiben
oZielBereich.setDataArray( alleDaten() )
' CSV-Datei schliessen
oCSV.close( TRUE )
End If
End Sub
' ========================================================================
' rein: Sheet als Object
' raus: Nummer der letzten Zeile/Spalte (bei Null beginnend)
Function iC2C_getLastUsedColumn(oSheet as Object) as Integer
Dim oCell As Object
Dim oCursor As Object
Dim aAddress As Variant
oCell = oSheet.GetCellbyPosition( 0, 0 )
oCursor = oSheet.createCursorByRange(oCell)
oCursor.GotoEndOfUsedArea(True)
aAddress = oCursor.RangeAddress
iC2C_getLastUsedColumn = aAddress.EndColumn
End Function
Function iC2C_getLastUsedRow(oSheet as Object) as Integer
Dim oCell As Object
Dim oCursor As Object
Dim aAddress As Variant
oCell = oSheet.GetCellbyPosition( 0, 0 )
oCursor = oSheet.createCursorByRange(oCell)
oCursor.GotoEndOfUsedArea(True)
aAddress = oCursor.RangeAddress
iC2C_GetLastUsedRow = aAddress.EndRow
End Function
' Filtre sur virgule
' =========================
' Zum Ermitteln der Filteroptionen für *Deine* CSV-Datei: öffne sie (aus OOo, über
' Dateidialog, unter Verwendung des Import-Dialogs, mit allen nötigen
' Einstellungen), dann lasse folgendes laufen. Notiere die Rückgabe und ersetze im
' Code oben die Werte:
' http://www.oooforum.org/forum/viewtopic.phtml?t=40544
' Villeroy Aug 02, 2006 12:08 am
Sub showFilterOptions
Dim args(),i%
args() = thisComponent.getArgs
for i = 0 to uBound(Args())
if args(i).Name = "FilterOptions" then inputbox "","",args(i).value
next
End Sub
' =========================Je ne connais quasi rien en VBA et donc je m'étais dis qu'il devrait suffire de remplacer "","" par "";"" dans la partie showFilterOptions...
Code : Tout sélectionner
Sub showFilterOptions
Dim args(),i%
args() = thisComponent.getArgs
for i = 0 to uBound(Args())
if args(i).Name = "FilterOptions" then inputbox "","",args(i).value
next
End Sub Quelqu'un aurait-il une idée?
Merci d'avance

