Makro wczytujące CSV

Dyskusje dotyczące tworzenia makropoleceń, pisania skryptów oraz programowania przy użyciu UNO
agusiaczq
Posty: 1
Rejestracja: pt maja 13, 2016 10:20 am

Makro wczytujące CSV

Post autor: agusiaczq »

Witam

mam makro które wczytuje plik csv, i to działało mi na windows7 po przeniesieniu tego makra na Windows8 wyskakuje mi błąd:

"Błąd uruchomieniowy Języka Basic.
Nie ustawiono zmiennej obiektu"

i zaznacza linię

oActiveCell = oDoc.CurrentSelection

w czym jest problem?

Makro :

sub Main
Dim oDoc as variant
dim oActiveCell as object
dim oArkusz, oArkusz2 as object
dim iNumber, granica,powtorzen,dosumowania,bazaj as integer
dim oZakres1, oReplace as object
Dim aSortFields(3) As New com.sun.star.util.SortField
Dim aSortFields2(1) As New com.sun.star.util.SortField
Dim aSortAscend(0) As New com.sun.star.beans.PropertyValue
Dim oCell, oCell4 As Object
Dim oCursor, oCursor1 As Object
Dim aAddress As Variant
Dim LocalSettings As new com.sun.star.lang.Locale
Dim NumberFormatId as long
Dim filterNames(0) As String
Dim oFileDialog as Object
Dim iAccept as Integer
Dim sPath, sLine as String
Dim args1(3) As New com.sun.star.beans.PropertyValue

GlobalScope.BasicLibraries.LoadLibrary("Tools")

LocalSettings.Language = "pl"
LocalSettings.Country = "pl"
NumberFormatId = ThisComponent.NumberFormats.queryKey("###0,00;[RED]-###0,00", LocalSettings,True)
If NumberFormatId = -1 then
NumberFormatId = ThisComponent.NumberFormats.addNew("###0,00;[RED]-###0,00", LocalSettings)
end if
NumberFormatIdDaty = ThisComponent.NumberFormats.queryKey("DD.MM.YYYY", LocalSettings,True)
If NumberFormatIdDaty = -1 then
NumberFormatIdDaty = ThisComponent.NumberFormats.addNew("DD.MM.YYYY", LocalSettings)
end if

if ThisComponent.Sheets.hasByName("F") then
oArkusz2 = ThisComponent.Sheets.getByName("F")
Else
oArkusz2 = ThisComponent.createInstance("com.sun.star.sheet.Spreadsheet")
ThisComponent.Sheets.insertByName("F", oArkusz2)
end if

oArkusz2.Rows.removeByIndex(0,64000)

filterNames(0) = "*.csv"
oFileDialog = CreateUnoService("com.sun.star.ui.dialogs.FilePicker")
AddFiltersToDialog(filterNames(), oFileDialog )
iAccept = oFileDialog.Execute()
If iAccept = 1 Then
sPath = oFileDialog.Files(0)
GetAFileName = sPath
End If
oFileDialog.Dispose()

args1(0).Name = "InteractionHandler"
args1(0).Value = ""
args1(1).Name = "FilterName"
args1(1).Value = "Text - txt - csv (StarCalc)"
args1(2).Name = "CharacterSet"
args1(2).Value = 13 ' ISO-8859-2
args1(3).Name = "FilterOptions" ' opcje importu
args1(3).Value = "44,34,0,1,1/2/2/2/3/2/4/2/5/2/6/2/7/2/8/2/9/2/10/5"
oDesk = createUnoService("com.sun.star.frame.Desktop")
oDoc = oDesk.LoadComponentFromURL( GetAFileName, "_blank", 0, args1())


oActiveCell = oDoc.CurrentSelection

oCursor = oDoc.Sheets(0).createCursorByRange(oActiveCell)
oCursor.GotoEndOfUsedArea(True)
aAddress = oCursor.RangeAddress
oZakres1 = oArkusz2.getCellRangeByPosition(9,0,9,aAddress.EndRow)
oZakres1.NumberFormat = NumberFormatIdDaty

oZakres1 = oDoc.Sheets(0).getCellRangeByPosition(0,0,aAddress.EndColumn,aAddress.EndRow)
oZakres2 = oArkusz2.getCellRangeByPosition(0,0,aAddress.EndColumn,aAddress.EndRow)
oZakres2.setDataArray(oZakres1.getDataArray())
oDoc.close(true)


End sub
OpenOffice.org 3.5 na Windows 8
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Makro wczytujące CSV

Post autor: belstar »

Jeden z argumentów się zdezaktualizował, pewnie wersję OO też zmieniłaś.
Poprawione makro:

Kod: Zaznacz cały

sub Main
Dim oDoc as variant
dim oActiveCell as object
dim oArkusz, oArkusz2 as object
dim iNumber, granica,powtorzen,dosumowania,bazaj as integer
dim oZakres1, oReplace as object
Dim aSortFields(3) As New com.sun.star.util.SortField
Dim aSortFields2(1) As New com.sun.star.util.SortField
Dim aSortAscend(0) As New com.sun.star.beans.PropertyValue
Dim oCell, oCell4 As Object
Dim oCursor, oCursor1 As Object
Dim aAddress As Variant
Dim LocalSettings As new com.sun.star.lang.Locale
Dim NumberFormatId as long
Dim filterNames(0) As String
Dim oFileDialog as Object
Dim iAccept as Integer
Dim sPath, sLine as String
Dim args1(2) As New com.sun.star.beans.PropertyValue

GlobalScope.BasicLibraries.LoadLibrary("Tools")

LocalSettings.Language = "pl"
LocalSettings.Country = "pl"
NumberFormatId = ThisComponent.NumberFormats.queryKey("###0,00;[RED]-###0,00", LocalSettings,True)
If NumberFormatId = -1 then
NumberFormatId = ThisComponent.NumberFormats.addNew("###0,00;[RED]-###0,00", LocalSettings)
end if
NumberFormatIdDaty = ThisComponent.NumberFormats.queryKey("DD.MM.YYYY", LocalSettings,True)
If NumberFormatIdDaty = -1 then
NumberFormatIdDaty = ThisComponent.NumberFormats.addNew("DD.MM.YYYY", LocalSettings)
end if

if ThisComponent.Sheets.hasByName("F") then
oArkusz2 = ThisComponent.Sheets.getByName("F")
Else
oArkusz2 = ThisComponent.createInstance("com.sun.star.sheet.Spreadsheet")
ThisComponent.Sheets.insertByName("F", oArkusz2)
end if

oArkusz2.Rows.removeByIndex(0,64000)

filterNames(0) = "*.csv"
oFileDialog = CreateUnoService("com.sun.star.ui.dialogs.FilePicker")
AddFiltersToDialog(filterNames(), oFileDialog )
iAccept = oFileDialog.Execute()
If iAccept = 1 Then
sPath = oFileDialog.Files(0)
GetAFileName = ConvertToURL(sPath)
End If
oFileDialog.Dispose()

args1(0).Name = "FilterName"
args1(0).Value = "Text - txt - csv (StarCalc)"
args1(1).Name = "CharacterSet"
args1(1).Value = 13 ' ISO-8859-2
args1(2).Name = "FilterOptions" ' opcje importu
args1(2).Value = "44,34,0,1,1/2/2/2/3/2/4/2/5/2/6/2/7/2/8/2/9/2/10/5"
oDesk = createUnoService("com.sun.star.frame.Desktop")
oDoc = oDesk.LoadComponentFromURL(GetAFileName, "_blank", 0, args1())


oActiveCell = oDoc.CurrentSelection
oCursor = oDoc.Sheets(0).createCursorByRange(oActiveCell)
oCursor.GotoEndOfUsedArea(True)
aAddress = oCursor.RangeAddress
oZakres1 = oArkusz2.getCellRangeByPosition(9,0,9,aAddress.EndRow)
oZakres1.NumberFormat = NumberFormatIdDaty

oZakres1 = oDoc.Sheets(0).getCellRangeByPosition(0,0,aAddress.EndColumn,aAddress.EndRow)
oZakres2 = oArkusz2.getCellRangeByPosition(0,0,aAddress.EndColumn,aAddress.EndRow)
oZakres2.setDataArray(oZakres1.getDataArray())
oDoc.close(true)

End sub
A tak poza tym masz w tym makrze zadeklarowanych zmiennych których nie wykorzystujesz, zajmują tylko miejsce w pamięci. Pousuwaj je, mi w tej chwili brak czasu.
LibreOffice 5.1.2.2 Ubuntu 16 LTS
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Makro wczytujące CSV

Post autor: Jan_J »

OK @belstar, zareagowaliśmy paralelnie...

Myślę, że zmiana wersji Calca jest tu istotniejsza, niż zmiana systemu operacyjnego. StarBasic nie korzysta z bibliotek systemowych, powinien działać tak samo nawet pod Linuksem i Mac-em, a co dopiero w Windows 8.

Kod: Zaznacz cały

oDoc = oDesk.LoadComponentFromURL( GetAFileName, "_blank", 0, args1())

oActiveCell = oDoc.CurrentSelection
To znaczy, że podczas próby realizacji tej instrukcji okazało się, nie istnieje obiekt oDoc. Skoro poprzednia instrukcja go wczytywała, mniemam że się to nie udało.

I rzeczywiście. Próbując wywołać main() na LibreOffice 5.0 pod Windows XP dostaję ten sam błąd. Problem jest z

Kod: Zaznacz cały

args1(0).Name = "InteractionHandler"
args1(0).Value = ""
Po zakomentowaniu i wynikającej z niego zmianie numeracji pozostałych opcji filtra wszystko przebiega prawidłowo. Widocznie zmieniło się znaczenie opcji InteractionHandler, trzeba by sprawdzić w dokumentacji. Myślę, że w zamiarze wyłączała ona kreator importu. Albo wyleciała ze specyfikacji, albo nazywa się inaczej, albo nie akceptuje pustego napisu jako wartości, albo ma błąd w obsłudze, albo nie wiem co.


PS. kod programów opakowujemy w znaczniki [ code ]...[ /code ] (są na przyciskach nad oknem edycji).
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
ODPOWIEDZ