Makro wczytujące CSV

Dyskusje dotyczące tworzenia makropoleceń, pisania skryptów oraz programowania przy użyciu UNO

Makro wczytujące CSV

Postprzez agusiaczq » Pt maja 13, 2016 10:40 am

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
agusiaczq
 
Posty: 1
Dołączył(a): Pt maja 13, 2016 10:20 am

Re: Makro wczytujące CSV

Postprzez belstar » Pt maja 13, 2016 3:53 pm

Jeden z argumentów się zdezaktualizował, pewnie wersję OO też zmieniłaś.
Poprawione makro:
Kod: Zaznacz cały   Rozszerz widokZwiń widok
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
belstar
 
Posty: 635
Dołączył(a): Cz mar 17, 2011 9:08 am

Re: Makro wczytujące CSV

Postprzez Jan_J » Pt maja 13, 2016 3:58 pm

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   Rozszerz widokZwiń widok
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   Rozszerz widokZwiń widok
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 5.4 ∙ AOO 4.1.4 ∙ Python (3.6|2.7) ∙ Unicode 10 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3625
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław


Powrót do Makra i programowanie

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość