programing

vba 코드를 libreoffice와 호환되도록 하려면 어떻게 해야 합니까?

goodsources 2023. 6. 15. 21:48
반응형

vba 코드를 libreoffice와 호환되도록 하려면 어떻게 해야 합니까?

나는 최근에 윈도우에서 pclinuxos로 마이그레이션했고 그것을 좋아하는 것 같습니다.제가 직면한 유일한 문제는 기본 스프레드시트 패키지인 libreoffice가 Excel 매크로와 호환되지 않는다는 것입니다.아래는 제가 가지고 있는 vba 코드입니다.

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

libreoffice와 호환되도록 이 코드를 변환하는 방법이 있습니까? 아니면 파이썬과 같은 완전히 새로운 언어를 배워야 합니까?vba 코드가 많은 엑셀에 업무 관련 파일이 많고 회사에서 오픈오피스/libreoffice를 사용할 수 없기 때문에 파이썬을 배우는 것은 문제가 되지 않지만 제 문제에 대한 해결책은 아닙니다.

SinceLastWash 함수는 내가 사용하는 일부 셀에서 정확한 값을 제공하고 다른 셀에서는 #NAME? 오류를 제공한다는 것을 추가하고 싶습니다.

감사해요.

LibreOffice의 온라인 도움말 파일에서:

몇 가지 예외를 제외하고 Microsoft Office와 LibreOffice는 동일한 매크로 코드를 실행할 수 없습니다.Microsoft Office는 VBA(Visual Basic for Applications) 코드를 사용하고 LibreOffice는 LibreOffice API(Application Program Interface) 환경에 기반한 Basic 코드를 사용합니다.프로그래밍 언어는 동일하지만 객체와 방법은 다릅니다.

LibreOffice - Preferences에서 이 기능을 활성화하면 최신 버전의 LibreOffice에서 일부 Excel Visual Basic 스크립트를 실행할 수 있습니다.[도구] - [옵션] - [로드/저장] - [VBA 속성]을 선택합니다.

실제로 LibreOffice API를 사용하여 기능을 다시 작성해야 합니다.

UNO API를 사용하려면 문서를 조작하는 부분을 변환해야 합니다.안타깝게도 매크로가 수행하는 작업에 따라 이 작업은 까다로울 수 있습니다.기본 문은 직접 작동합니다.일반적으로 문서를 수정할 수 없습니다.

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

셀 명령은 행과 열을 기준으로 특정 셀을 반환합니다.따라서 현재 행이 필요합니다.활성화된 세포를 얻기 위한 광기가 있습니다.

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

활성화된 셀이 있으면 셀 주소를 얻을 수 있고, 그로부터 행을 얻을 수 있습니다.범위를 사용할 필요가 전혀 없습니다. 단일 셀에만 관심이 있으므로 활성 시트를 얻은 다음 시트에서 특정 셀을 얻습니다.

이와 같은 것:이 Component.getCurrentController().getActiveSheet().getCellByPosition(nCol, nRow)입니다.getString() = "a"

이게 무슨 짓인지 이해하고 싶지 않아요

Selection.SpecialCells(xlBlanks).Delete shift:=xlToLeft

LibreOffice 4.4에서는 첫 번째 서브루틴이 전혀 작동하지 않습니다('xl'로 시작하는 모든 변수 때문인 것 같습니다).이 셀을 활성 셀로 변경하면 나머지 두 개가 완벽하게 작동합니다.

보다는

Option VBASupport 

사용 중

Option VBASupport 1
Option Compatible

제가 알고 있는 유일한 자동 도구는 비즈니스 스프레드시트입니다(개인적 또는 전문적인 경험이 없거나 사이트와 제휴 관계가 없습니다).

OpenOffice에만 국한된 것 같지만 LibreOffice와도 작동하는 것 같습니다.

하지만 일반적으로, 도구가 완벽하지 않기 때문에 직접 하는 것이 좋습니다.

언급URL : https://stackoverflow.com/questions/24724050/how-do-i-make-vba-code-compatible-with-libre-office

반응형