2014-07-13 52 views
8

Ho recentemente migrato a pclinuxos da Windows e sembra piacermi. L'unico problema che sto affrontando è che libreoffice, il pacchetto di fogli di calcolo predefinito non è compatibile con i macro di Excel. Di seguito è riportato il codice VBA che ho:Come faccio a rendere il codice vba compatibile con libre office

Option VBASupport 
Sub DeleteToLeft() 
    Selection.SpecialCells(xlBlanks).Delete shift:=xlToLeft 
End Sub 
Function SinceLastWash() 
    Application.Volatile 
    WashCount = 0 
    WearCount = 0 
    CurrentRow = Application.ThisCell.Row 
    For i = 3 To 35 
     If Range(Cells(CurrentRow, i), Cells(CurrentRow, i)).Value = "a" Then 
      WearCount = WearCount + 1 
     End If 
     If Range(Cells(CurrentRow, i), Cells(CurrentRow, i)).Value = "q" Then 
      WashCount = WashCount + 1 
      WearCount = 0 
     End If 
    Next i 
    SinceLastWash = WearCount 
End Function 
Function testhis() 
testhis = Application.ThisCell.Row 
End Function 

C'è un modo per convertire il codice per renderlo compatibile con LibreOffice o devo imparare un linguaggio del tutto nuovo come Python? Imparare Python non sarebbe un problema, ma non è una soluzione al mio problema perché ho molti file relativi al lavoro in Excel che hanno un sacco di codice VBA e non mi è possibile usare open office/libreoffice al lavoro ...

Voglio solo aggiungere che la funzione SinceLastWash fornisce il valore corretto in alcune celle in cui lo uso e in altri dà un errore, #NOME?

Grazie

risposta

1

L'unico strumento automatico io sappia è Business Spreadsheets (nota che non ho esperienza personale o professionale né alcuna affiliazione con il sito).

Sembra specifico per OpenOffice ma penso che funzioni anche con LibreOffice.

In generale, comunque, è meglio farlo da soli, come lo strumento è lungi dall'essere perfetto ...

5

Da LibreOffice's online help file:

Con poche eccezioni, Microsoft Office e LibreOffice non possono funzionare lo stesso codice macro. Microsoft Office utilizza il codice VBA (Visual Basic, Applications Edition) e LibreOffice utilizza il codice di base basato sull'ambiente API (Application Program Interface) di LibreOffice. Sebbene il linguaggio di programmazione sia lo stesso, gli oggetti e i metodi sono diversi.

Le versioni più recenti di LibreOffice possono eseguire alcuni script di Excel Visual Basic se si attiva questa funzione su LibreOffice - PreferencesTools - Opzioni - Carica/Salva - Proprietà VBA.

In realtà, molto probabilmente dovresti sederti con the LibreOffice API e riscrivere la funzionalità.

1

In LibreOffice 4.4, la prima subroutine non funziona affatto (ho il sospetto a causa di tutte le variabili che iniziano con 'xl'. Gli altri due lavori perfettamente se si cambia ThisCell a ActiveCell.

Piuttosto che

Option VBASupport 

sto usando

Option VBASupport 1 
Option Compatible 
1

È necessario tradurre le parti che manipolano il documento per utilizzare l'API UNO. Purtroppo, questo può essere difficile a seconda di ciò che si r macro fa. Le istruzioni di base funzionano direttamente. La modifica di un documento generalmente no.

Range(Cells(CurrentRow, i), Cells(CurrentRow, i)).Value = "a" 

Le celle di comando restituisce una cella specifica basata su una riga e colonna. Quindi, hai bisogno della riga corrente.Ecco alcuni pazzia per ottenere la cella attiva:

Sub RetrieveTheActiveCell() 
    Dim oOldSelection 'The original selection of cell ranges 
    Dim oRanges  'A blank range created by the document 
    Dim oActiveCell 'The current active cell 
    Dim oConv   'The cell address conversion service 
    Dim oDoc 
    oDoc = ThisComponent 

    REM store the current selection 
    oOldSelection = oDoc.CurrentSelection 

    REM Create an empty SheetCellRanges service and then select it. 
    REM This leaves ONLY the active cell selected. 
    oRanges = oDoc.createInstance("com.sun.star.sheet.SheetCellRanges") 
    oDoc.CurrentController.Select(oRanges) 

    REM Get the active cell! 
    oActiveCell = oDoc.CurrentSelection 

    oConv = oDoc.createInstance("com.sun.star.table.CellAddressConversion") 
    oConv.Address = oActiveCell.getCellAddress 
    Print oConv.UserInterfaceRepresentation 
    print oConv.PersistentRepresentation 

    REM Restore the old selection, but lose the previously active cell 
    oDoc.CurrentController.Select(oOldSelection) 
End Sub 

Quando si ha la cella attiva, si ottiene l'indirizzo della cella, e da questo, si ha la riga. Non è necessario utilizzare l'intervallo, poiché si interessa solo di una singola cella, quindi si ottiene il foglio attivo e quindi si ottiene una determinata cella dal foglio.

Qualcosa di simile a questo:.. ThisComponent.getCurrentController() getActiveSheet() getCellByPosition (nCol, nRow) .getString() = "a"

Non mi sento come capire che cosa questo fa

0

Selection.SpecialCells(xlBlanks).Delete shift:=xlToLeft elimina le celle vuote se non sbaglio

Problemi correlati