[ VBA ユーザーの為の OpenOffice.org 備忘録 ]
[UserFunc] は【マイマクロ > Standard 】に入れて利用してください。
将来的には 『OOo 版 kt関数アドイン』に収録してリリースする予定です。
ここに掲載しているのは OOo 3.0.0 で確認してある機能です( LibreOffice での検証は行っていません)。
OOo はバージョンアップに伴って、かなり機能改善が施されています。ネットで公開されている解説サイトの資料は、その書かれた時期によって
1.x 系 , 2.x 系 , 3.x 系 を対象とするものが混在しています。その為、あるサイトでは 「それは出来ない。難しい処理が必要」 と説明されていた
ものが、他のサイトでは 「プロパティ/メソッド がある」 と書かれているケースも多々あります。ここに掲載している処理も後のバージョンでは簡単な
プロパティ/メソッド で対応されるものも出て来るでしょう。ひとつの解説サイトだけではなく、複数の解説サイトを比較して勉強することをお勧めします。
【 VBA vs OOo.Basic 対比表 】 ユーザー定義関数の一覧
( ■: OOo 備忘録 ,★: はにゃ?さんの OOo Wiki 等 他サイト )
【 VBA 】 | 【 OOo.Basic 】 | |
■ | OBJECT.getXXXX() , OBJECT.setXXXX() [メソッド] イコール OBJECT.XXXX [プロパティ] |
|
UserForm (VBA) / Dialog (OOo) | ||
Load UserForm1 | ■ | DialogLibraries.LoadLibrary ( "Standard" ) oDialog = CreateUnoDialog ( DialogLibraries.Standard.Dialog1 ) |
UserForm1.Show | ■ | oDialog.execute() |
UserForm1.Hide | ■ | oDialog.endExecute() |
UnLoad UserForm1 | ■ | oDialog.dispose() |
Controls ("TextBox1") | ★ | oDialog.getControl ("TextField1") 〜 モデル 〜 oDialog.getControl("TextField1").Model or oDialog.Model.getByName("TextField") |
Controls ("TextBox1").Parent | ■ | oDialog.getControl ("TextField1").Context |
Label1.Font.Bold = True Label1.Font.Bold = False |
★ | oLabel1.Model.FontWeight = com.sun.star.awt.FontWeight.BOLD oLabel1.Model.FontWeight = com.sun.star.awt.FontWeight.NORMAL |
TextBox1.Enabled = True/False MsgBox TextBox1.Enabled |
■ | oTextField1.Enable = True/False or oTextField1.setEnable ( True/False ) MsgBox oTextField1.isEnabled |
TextBox1.Visible = True/False MsgBox TextBox1.Visible |
■ | oTextField1.Visible = True/False or oTextField1.setVisible ( True/False ) MsgBox oTextField1.isVisible |
RefEdit コントロール | ■ | Range Selection Dialog 汎用ツール |
(擬似)コントロール配列&イベント | ■ | 複数コントロール間でのイベント共有が可能 |
Sub TextBox1_Exit _ ( ByVal Cancel As MSForms.ReturnBoolean ) If Not IsNumeric( TextBox1.Value ) Then Cancel = True |
■ | Sub TextField1_focusLost _ ( oEvent As com.sun.star.awt.FocusEvent ) If Not IsNumeric( oEvent.Source.Model.Text ) Then oEvent.Source.setFocus |
OptionButton のグループ分け (GroupName指定 or フレーム内配置) |
■ | OptionButton のグループ分け (TabIndex が連続する範囲のオプションボタンが同一グループ) |
SpinButton | ■ | マクロからの動的作成が必要 |
ListBox ( 複数列が可能 ) | ■ | ListBox ( 1列のみ ) |
ListBox1.List ( n ) = "abc" 格納済データの更新 | ■ | 格納済データの更新は不可。総入替が必要。 |
【コントロールの右隣にサブダイアログを表示する】 lngPosX = Me.Left + Ctrl.Left + Ctrl.Width lngPosY = Me.Top + Ctrl.Top Load SubForm With SubForm .Left = lngPosX .Top = lngPosY .StartUpPosition = 0 .Show End With |
■ | oDialogPosSize = oDialog.getPosSize() oCtrlPosSize = oCtrl.getPosSize() lngPosX = oDialogPosSize.X + oCtrlPosSize.X + oCtrlPosSize.Width lngPosY = oDialogPosSize.Y + oCtrlPosSize.Y DialogLibraries.LoadLibrary("Standard") oSubDialog = CreateUnoDialog(DialogLibraries.Standard.SubDialog) oSubDialog.setPosSize _ (lngPosX, lngPosY, 0, 0, com.sun.star.awt.PosSize.POS) oSubDialog.execute() |
【プログレスバー コントロール】 mscomctl.ocx の外部コントロールを利用 または、ラベルで自作/アドインソフトを利用 (詳細はリンク先参照) |
■ | 【プログレスバー コントロール】 標準コントロールの プログレスバーコントロールを利用 (詳細はリンク先参照) |
■ | ||
Application (VBA) / StarDeskTop or Component (OOo) | ||
Application.ScreenUpdating = False Application.ScreenUpdating = True |
■ | ドキュメントオブジェクト.LockControllers ドキュメントオブジェクト.UnlockControllers |
Application.CommandBars("WorkSheet Menu Bar") | ■ | 『 標準メニューバーにメニュー追加 』記事を参照 |
右クリックメニュー Application.CommandBars("Cell") |
■ | XContextMenuInterception (汎用マクロは こちら の記事) |
ユーザー ライブラリ パス strFile = Application.UserLibraryPath & "ABC.xla" C:\Documents and Settings\USERNAME \Application Data\Microsoft\AddIns\ABC.xla |
■ | Dim oSubstitutedPath As Object oSubstitutedPath = CreateUnoService _ ( "com.sun.star.util.PathSubstitution" ) strURL = oSubstitutedPath.SubstituteVariables _ ( "$(user)/ABC.ods", True ) file:///C:/Documents and Settings/USERNAME /Application Data/OpenOffice.org/3/user/ABC.ods |
【ステータスバー上にプログレスバー】 "■■□□"の文字表示を自分で調整する (詳細はリンク先参照) |
■ | 【ステータスバー上にプログレスバー】 XStatusIndicator インターフェースでダイアログの場合と同様に 操作できる(詳細はリンク先参照) |
■ | ||
Workbook (VBA) / Document or Component (OOo) | ||
ThisWorkbook | ■ | ThisComponent |
ActiveWorkbook | ■ | StarDesktop.CurrentComponent (IDE から実行した場合は駄目) or ThisComponent or ActiveComponent [UserFunc] |
Workbooks ("Book1.xls") | ■ | GetComponent ("Document1.ods") [UserFunc] |
Workbooks ("Book1.xls").Activate | ■ | GetComponent ("Document1.ods", True) [UserFunc] |
Set wkbk = Workbooks.Add | ★ | oDoc = StarDesktop.loadComponentFromURL _ ("private:factory/scalc", "_blank", 0, Array()) |
Set wkbk = Workbooks.Open _ FileName:="C:\My Documents\ABC.xls" |
★ | oDoc = StarDesktop.loadComponentFromURL _ ("file:///C:/My Documents/ABC.ods", "_blank", 0, Array()) |
マクロ有効確認ダイアログ付きでドキュメントを開く | ★ | Dim aArg(0) As New com.sun.star.beans.PropertyValue aArg(0).Name = "MacroExecutionMode" aArg(0).Value = _ com.sun.star.document.MacroExecMode.USE_CONFIG oDoc = StarDesktop.loadComponentFromURL _ (URL, "_blank", 0, aArg()) 無効で開く : NEVER_EXECUTE 有効で開く : ALWAYS_EXECUTE_NO_WARN |
読み取り専用 & 非表示でドキュメントを開く その他のオプション(Name)と設定値(Value) |
★ | Dim aArg(1) As New com.sun.star.beans.PropertyValue aArg(0).Name = "ReadOnly" aArg(0).Value = True aArg(1).Name = "Hidden" aArg(1).Value = True oDoc = StarDesktop.loadComponentFromUrl _ (URL, "_blank", 0, aArg()) |
ActiveWorkbook.Save | ★ | ThisComponent.store() |
ActiveWorkbook.SaveAs _ Filename:="C:\My Documents\ABC.xls" |
★ | ThisComponent.storeAsURL _ ("file:///C:/My Documents/ABC.ods" ,Array()) |
If IsNull (ActiveWorkbook.Path) Then ' 未保存ブック |
★ | If ThisComponent.hasLocation Then '未保存ドキュメント |
If Not ActiveWorkbook.Saved Then ' 更新が未保存 '更新ステータスをキャンセル(更新なし) ActiveWorkbook.Saved = True |
■ | If ThisComponent.Modified Then ' 更新が未保存 '更新ステータスをキャンセル(更新なし) ThisComponent.Modified = False |
ActiveWorkbook.Close | ■ | ThisComponent.Close(True) |
ActiveWorkbook.FullName | ■ | ThisComponent.URL |
ActiveWorkbook.Path | ★ | aURL = CreateUnoStruct("com.sun.star.util.URL") aURL.Complete = ThisComponent.URL CreateUnoService("com.sun.star.util.URLTransformer") _ .parseStrict(aURL) strPath = aURL.Path or vntURL = Split(ThisComponent.URL, "/") i = UBound(vntURL) ReDim Preserve vntURL(i - 1) strPath = Join(vntURL, "/") |
ActiveWorkbook.Name | ■ | ThisComponent.Title or vntURL = Split(ThisComponent.URL, "/") strName = vntURL(UBound(vntURL)) |
For Each wkbk In Application.Workbooks MsgBox wkbk.Name |
■ | For Each oComponent In StarDesktop.Components If HasUnoInterfaces _ (oComponent, "com.sun.star.frame.XModel") then MsgBox oComponent.Title |
■ | ||
Sheet | ||
ActiveSheet | ★ | ThisComponent.CurrentController.ActiveSheet |
ActiveSheet.Index | ■ | oActiveSheet = ThisComponent.CurrentController.ActiveSheet SheetIndex = oActiveSheet.RangeAddress.Sheet |
Worksheets ( 0 ) | ★ | ThisComponent.getSheets.getByIndex ( 0 ) |
Worksheets ("Sheet1") | ★ | ThisComponent.getSheets.getByName ("Sheet1") |
Worksheets ("Sheet1").Activate | ■ | SheetActivate (ThisComponent, "Sheet1") [UserFunc] |
★ | With ThisComponent oController = .getCurrentController() oSheet = .getSheets.getByName("Sheet1") oController.setActiveSheet(oSheet) End With |
|
Worksheet ("Sheet1").Parent | ■ | oSheet.DrawPage.Forms.Parent |
Worksheets ("Sheet1").ProtectContents | ■ | oSheet.isProtected |
For Each wksh In ThisWorkbook.Worksheets MsgBox wksh.Name |
■ | For Each oSheet In ThisComponent.Sheets MsgBox oSheet.Name |
【 シート上のコントロール 】 MsgBox Worksheets ("Sheet1") _ .OLEObjects ("CheckBox1").Object.Value |
★ | oSheet=ThisComponent.getSheets.getByName("Sheet1") oForm=oSheet.DrawPage.Forms.getByName("Standard") oCheckBox = oForm.getByName("CheckBox1") MsgBox oCheckBox.State |
■ | ||
Cell | ||
Cells ( 5, 2 ) 'B5 | ■ | getCellByPosition ( 1, 4 ) 'B5 |
Range ("B5") | ■ | getCellRangeByName ("B5") |
Range ("A1").Address (True,True) | ■ | oCell.AbsoluteName |
Range ("A1").Address (False,False) | ■ | Join ( Split ( oCell.AbsoluteName, "$" ), "" ) |
Range ("A1").Row ( 値は 1 〜 ) Range ("A1").Column ( 値は 1 〜 ) |
■ | oCell.CellAddress.Row ( 値は 0 〜 ) oCell.CellAddress.Column ( 値は 0 〜 ) |
Application.Selection [セル] | ★ | oSelection = ThisComponent.CurrentController.Selection or oSelection = ThisComponent.CurrentSelection |
ActiveSheet.Range("A1").Select | ★ | oController = ThisComponent.getCurrentController() oSheet = oController.getActiveSheet oCell = oSheet.getCellRangeByName("A1") oController.select(oCell) |
RANGE .Offset (ROW, COLUMN) | ■ | oCell1 = oSheet.getCellRangeByName("C5") With oCell1.CellAddress oCell2 = oSheet.getCellByPosition(( .Column + 1), ( .Row + 1)) End With or GetOffsetRange(BASE_RANGE, COLUMN, ROW [. SELECT]) [UserFunc] |
Range("B5").Activate | ■ | Dim oCell As Object oCell = ThisComponent.getSheets(0).getCellRangeByName("B5") Call CellActivate ( oCell ) [UserFunc] |
ActiveCell | ■ | GetActiveCell() [UserFunc] |
ActiveCell.Offset (ROW, COLUMN).Activate | ■ | ActiveCellOffset(COLUMN, ROW) [UserFunc] |
Range ("A1").Parent (親 Sheet ) | ■ | oCell.Spreadsheet |
Range ("A1").Parent.Parent (親 Book ) | ■ | oCell.Spreadsheet.DrawPage.Forms.Parent |
Range ("A1").Locked | ■ | oCell.CellProtection.IsLocked |
Range ("A65536").End (xlUp).Row | ■ | GetLastCell( oSheet.Columns(0) ) [UserFunc] |
Range ("A1").NumberFormat = "@" | ■ | oCell.NumberFormat = GetKeyNumberFormat ("TEXT") [UserFunc] |
Cells.Count | ■ | GetCellsCount(oCells) [UserFunc] |
' セル範囲 Areas コレクション For Each Rng In Selection.Areas MsgBox Rng.Address |
■ | ' セル範囲コンテナ For Each oRange In ThisComponent.CurrentSelection MsgBox oRange.AbsoluteName |
' セル範囲 For Each Cell In Range("A1:A10") Cell.Value = xxx |
■ | ' セル範囲 Dim oCellsItem() As Object oCells = ThisComponent.getSheets(0) _ .getCellRangeByName("A1:A10") lngCount = GetCellsItem(oCells, oCellsItem) [UserFunc] For i = 1 to lngCount oCellsItem( i ).Value = xxx Next i |
Application.Intersect ( RANGE1 , RANGE2 ) | ■ | oRANGE1.queryIntersection ( oRANGE2.RangeAddress ) (注) oRANGE1/oRANGE2 の親ドキュメントが同じであるという 確認はユーザー任せ(別ドキュメントでも動作する場合がある) |
Set rngBase = ActiveSheet.Range("B1:B10") Set rngTarget = ActiveSheet.Range("F1") rngBase.Copy Destination:=rngTarget |
■ | oBaseRange = oActiveSheet.getCellRangeByName ("B1:B10") oTargetCell = oActiveSheet.getCellRangeByName ("F1") oSheet.copyRange(oTargetCell.CellAddress, oBaseRange.RangeAddress) |
セルデータの一括読込/一括書出 vntArray = Range("A1:D10").Value Range("A1:D10").Value = vntArray |
■ | vntArray = ThisComponent.getSheets(0) _ .getCellRangeByName("A1:D10").getDataArray ThisComponent.Sheets(0) _ .getCellRangeByName("A1:D10").setDataArray(vntArray) |
■ | ||
Basic 構文 | ||
マクロの記録 | ■ | マクロの記録 |
【 Sub/Function での引数定義の注意事項 】 | ■ ■ ■ ■ ■ ■ |
・ オプション引数と IsMissing ・ Optional と Object は要注意 ・ エラー値の渡る可能性のある引数は ・・・ ・ #VALUE を返すユーザー定義関数 ・ セル範囲オブジェクトを引数で受け取る ・ シート関数での「オプション引数と IsMissing 」 |
Const cstBlue As Long = &HFF0000 Const cstRed As Long = &H0000FF& RGB関数 : RGB( 赤 , 緑 , 青 ) |
■ | Const cstBlue As Long = &H0000FF& Const cstRed As Long = &HFF0000 RGB関数 : RGB( 赤 , 緑 , 青 ) (※ VBA互換モードでは RGB関数を使用するべきではない) |
月末日 = DateSerial ( 年, 月 + 1, 0 ) | ■ | If ( 月 = 12 ) Then 月末日 = DateSerial ( 年, 12, 31 ) Else 月末日 = DateSerial ( 年, 月 + 1, 1 ) - 1 End If |
Dim ABC(1 to 5) Erase ABC '静的配列の初期化 |
■ | Dim ABC(1 to 5) ReDim ABC(1 to 5) '初期化は同サイズで ReDim |
Empty | ■ | Dim cstEmpty As Variant '[Empty]値の代替として何も設定せずに利用する |
Sleep (500) DoEvents |
■ | Wait (500) |
Replace ( "ABCD", "BC", "xyz" ) | ■ | Join ( Split ( "ABCD", "BC" ), "xyz" ) |
InStr ( "ABCD", "b" ) | ■ | InStr ( 1, "ABCD", "b", 0 ) |
TypeName ( OBJECT ) | ■ | OBJECT.ImplementationName |
OBJECT1 Is OBJECT2 OBJECT1 Is Nothing |
■ ■ |
EqualUnoObjects ( OBJECT1, OBJECT2 ) EqualSheetObjects ( SHEET1 , SHEET2 ) [UserFunc] OBJECT1 Is Nothing (Nothing 比較は可) |
Public Public & [ Option Private Module ] Private |
■ | Global ( Project 外でも有効 ) 注) 対象は『変数』のみ Public ( Project 内で有効 ) Sub/Func は全てPublic Private ( Module 内で有効 ) 指定してもエラーにはならない |
Result = _ WorksheetFunctions.XXXX(ARG1, ARG2) |
★ | Dim oFuncService As Object oFuncService = _ CreateUnoService("com.sun.star.sheet.FunctionAccess") Dim aArgs(0 to 1) As Variant aArgs(0) = ARG1 aArgs(1) = ARG2 Result = oFuncService.callFunction("XXXX", aArgs ) or Result = _ oFuncService.callFunction("XXXX", Array(ARG1, ARG2) ) |
【Excel95互換モードでの Match 】 Dim vntRC As Variant vntRC = Application.Match( キー, 検索範囲, 0 ) If IsError (vntRC) Then ' #N/A ' Not Found Else MsgBox vntRC ' 検索位置(1〜) End If |
■ | Dim oFuncService As Object Dim vntRC As Variant oFuncService = _ CreateUnoService("com.sun.star.sheet.FunctionAccess") vntRC = oFuncService.callFunction _ ("MATCH", Array( キー, 検索範囲, 0 ) ) If IsEmpty (vntRC) Then ' Not Found Else MsgBox vntRC ' 検索位置(1〜) End If |
【拡張子に関連付けられたプログラムの実行】 rc = ShellExecute (0, "Open", URL, vbNullString, _ vbNullString, SW_SHOWNORMAL) |
■ | oSystemShellExecute = createUnoService _ ("com.sun.star.system.SystemShellExecute") oSystemShellExecute.execute (URL, "", 0) |
【配列の代入】 ・・・ 配列構造&データのコピー Dim vntArray(1 to 3) As Variant Dim vntTemp As Variant vntTemp = vntArray |
■ | 【配列の代入】 ・・・ 代入元配列への参照設定 Dim vntArray(1 to 3) As Variant Dim vntTemp As Variant vntTemp = vntArray ReDim Preserve vntTemp(1 to 3) [コピー]にするには、代入後にサイズ変更無しで ReDim Preserve する。 |
【ユーザー定義型の代入】 ・・・ データのコピー Type UserDef1 Item1 As String Item2 As Integer End Type Dim ABC As UserDef1 Dim XYZ As UserDef1 XYZ = ABC |
■ | 【ユーザー定義型の代入】 ・・・ 代入元への参照設定 ユーザー定義型変数同士での代入で[値コピー]とするには、 関数内の局所変数経由での処理が必要。 |
【マウスのボタン判定】 Private Sub Label1_MouseUp(ByVal Button As Integer, _ ByVal Shift As Integer, _ ByVal X As Single, ByVal Y As Single) If (Button = 1) Then '左ボタン Else '右ボタン End If |
■ | 【マウスのボタン判定】 Sub MouseListener_mouseReleased _ ( oEvent As com.sun.star.awt.MouseEvent ) If ( oEvent.Buttons = com.sun.star.awt.MouseButton.LEFT ) Then '左ボタン Else '右ボタン End If |
【マウスの Shift , Ctrl , Alt 判定】 Private Sub Label1_MouseUp(ByVal Button As Integer, _ ByVal Shift As Integer, _ ByVal X As Single, ByVal Y As Single) Const cstShiftMask As Integer = 1 Const cstCtrlMask As Integer = 2 Const cstAltMask As Integer = 4 blnShift = CBool(Shift And cstShiftMask) blnCtrl = CBool(Shift And cstCtrlMask) blnAlt = CBool(Shift And cstAltMask) |
■ | 【マウスの Shift , Ctrl , Alt 判定】 Sub MouseListener_mouseReleased _ ( oEvent As com.sun.star.awt.MouseEvent ) blnShift = _ CBool(.Modifiers And com.sun.star.awt.KeyModifier.SHIFT) blnCtrl = _ CBool(.Modifiers And com.sun.star.awt.KeyModifier.MOD1) blnAlt = _ CBool(.Modifiers And com.sun.star.awt.KeyModifier.MOD2) |
【ワークシートのマウスイベント】 Worksheet_BeforeDoubleClick Worksheet_BeforeRightClick |
■ | 【シートのマウスイベント】 XMouseClickHandler [ Left Single Click ] XMouseClickHandler [ Left Double Click ] XEnhancedMouseClickHandler [ Right + (Shift or Ctrl or Alt) ] (右クリックの完全汎用マクロは こちら の記事) |
【セルの変化イベント】 Worksheet_Change |
■ | 【セルの変化イベント】 XModifyListener |
【Unicode文字の文字コード】 Asc ("あ") → -32096 , AscW ("あ") → 12354 Asc ("A") → -32160 , AscW ("A") → -223 Asc/AscW : Integer 型 Dim lngUnicode As Long lngUnicode = AscW (文字) If ( lngUnicode < 0 ) Then lngUnicode = lngUnicode + 65536 End If |
■ | 【Unicode文字の文字コード】 Asc ("あ") → 12354 Asc ("A") → 65313 Asc : Long 型 Dim lngUniCode As Long lngUnicode = Asc (文字) |
■ |
[ AddinBox Home へ ] [ OOo 備忘録へ ]
|
||
角田 桂一 Mail:addinbox@h4.dion.ne.jp CopyRight(C) 2009 Allrights Reserved. |