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
Makro wczytujące CSV
Makro wczytujące CSV
OpenOffice.org 3.5 na Windows 8
Re: Makro wczytujące CSV
Jeden z argumentów się zdezaktualizował, pewnie wersję OO też zmieniłaś.
Poprawione makro:
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.
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
LibreOffice 5.1.2.2 Ubuntu 16 LTS
Re: Makro wczytujące CSV
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.
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 zPo 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).
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
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 = ""
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)
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)