REM ***** BASIC ***** 'このファイルはクリエイティブ・コモンズ・ライセンス「表示 - 非営利 2.1 日本 (CC BY-NC 2.1)」の下でライセンスされています。 'シート番号指定版はシートを並び順の番号で把握し実行するマクロです(画面一番左にあるシートが0になりますのでシートの並び順が変更されるとマクロエラーになります) '***************** メインルーチン登録エリア ******************** '***************** サブルーチン 標準モジュール登録 ******************** '****************** 共通変数宣言 ******************** Public End_Row As Long 'データ最終行を格納 '**************************************************** '**************************************************** Sub Data_Clear(SheetNo as integer,Start_retsu as string,Start_gyou as long,End_retsu as string,End_gyou as long) '***************************************************************************** '* '* 機能 : データ範囲をパラメータ指定してクリアします '* 備考 : 開始行や終了行をパラメータで渡すことで可変範囲でのクリアを実行できます '***************************************************************************** '* 作成 : JAFukuoka) W " 2012.02.28 '* 処理ファイル名: '* 引数内容 :シートナンバー・開始列・開始行・終了列・終了行 '* 呼び出し例: Call Data_Clear(0,"A",14,"AR",40) 'シート0のA14〜AR40をクリア '***************************************************************************** Dim sClear_Range as string sClear_Range = Start_retsu & Start_gyou & ":" & End_retsu & End_gyou 'クリア範囲を指定 Rangeselect_clear(SheetNo,sClear_Range) 'シートを選択し、指定範囲をクリア End Sub Sub Range_Print(SheetNo as integer,P_Area as string,Houkou as integer,Psize as integer) '***************************************************************************** '* '* 機能 : データ欄を範囲指定して印刷します(セル番地で範囲指定) '* 備考 : '***************************************************************************** '* 作成 : JAFukuoka) W " 2012.01.11 '* 処理ファイル名: '* 引数内容 :シートナンバー, 印刷範囲, 用紙方向(1:縦 2:横),用紙サイズ(A4=1,A3=2) '* 呼び出し例:call Range_Print(0,"A1:B20",1,2) '***************************************************************************** Dim oDoc as Object Dim oSheet as Object Dim oPrint_Range as Object Dim aPrint_Area(0) as Object Dim aArg(0) as new com.sun.star.beans.PropertyValue Dim aPrinter(1) as new com.sun.star.beans.PropertyValue oDoc = ThisComponent oSheet = oDoc.Sheets(SheetNo) 'シートナンバーを指定 oPrint_Range = oSheet.getCellRangeByName(P_Area).rangeAddress aPrint_Area(0) = oPrint_Range oSheet.setPrintAreas(aPrint_Area()) aPrinter(0).name="PaperOrientation" If Houkou = 1 then aPrinter(0).Value = com.sun.star.view.PaperOrientation.PORTRAIT Else aPrinter(0).Value = com.sun.star.view.PaperOrientation.LANDSCAPE End if aPrinter(1).name="PaperFormat" If Psize = 1 then aPrinter(1).value=com.sun.star.view.PaperFormat.A4 Else aPrinter(1).value=com.sun.star.view.PaperFormat.A3 End if aArg(0).name="Wait" aArg(0).value=True oDoc.Printer = aPrinter() ThisComponent.print(aArg()) End Sub Sub Print_out(SheetNo as integer,s_retu as integer,s_gyou as long,e_retu as integer,e_gyou as long,houkou as integer,Psize as integer) '***************************************************************************** '* '* 機能 : データ欄を範囲指定して印刷します(数値座標で範囲指定します) '* 備考 : '***************************************************************************** '* 作成 : JAFukuoka) W " 2012.02.28 '* 処理ファイル名: '* 引数内容 :シートナンバー 開始列・開始行 終了列・終了行 用紙方向(1:縦 2:横),用紙サイズ(A4=1,A3=2) '* 呼び出し例: '***************************************************************************** Dim oDoc As Object Dim oSheet As Object Dim oRange As Object oRange = New com.sun.star.table.CellRangeAddress oDoc = ThisComponent oSheet = oDoc.Sheets(SheetNo) 'シートナンバーを指定 With oRange .Sheet = SheetNo 'シートナンバーを指定 .StartColumn = s_retu '開始列 A=0 .StartRow = s_gyou '開始行が1行目の時=0 .EndColumn = e_retu '終了列は L=11 .EndRow = e_gyou '終了行が11行目の時=10 End With oSheet.setPrintAreas(Array(oRange)) Dim aPrintOption(0) As New com.sun.star.beans.PropertyValue Dim aPrinter(1) As New com.sun.star.beans.PropertyValue aPrinter(0).Name = "PaperOrientation" If houkou = 1 then aPrinter(0).Value = com.sun.star.view.PaperOrientation.PORTRAIT Else aPrinter(0).Value = com.sun.star.view.PaperOrientation.LANDSCAPE End if aPrinter(1).Name = "PaperFormat" If Psize = 1 then aPrinter(1).value=com.sun.star.view.PaperFormat.A4 Else aPrinter(1).value=com.sun.star.view.PaperFormat.A3 End if oDoc.setPrinter(aPrinter()) oDoc.print(aPrintOption()) End sub Sub Rangeselect(SheetNo as integer,DataArea as string) '***************************************************************************** '* '* 機能 : データセルを選択します '* 備考 : '***************************************************************************** '* 作成 : JAFukuoka) W " 2012.01.11 '* 処理ファイル名: '* 引数内容 :シートナンバー ,選択範囲 '* 呼び出し例: Call Rangeselect(0,"A1")     'シート0 の A1を選択 '* 備考:指定したシートが非表示の場合、隣のシートが選択されますので注意! '***************************************************************************** Dim oController As Object Dim oSheet As Object oController = ThisComponent.getCurrentController() oSheet = ThisComponent.Sheets(SheetNo) oController.select (oSheet.getCellRangeByName(DataArea)) 'アクティブなセルを指定選択 End Sub Sub Rangeselect_clear(SheetNo as integer,DataArea as string) '***************************************************************************** '* '* 機能 : データを選択し消去します '* 備考 : '***************************************************************************** '* 作成 : JAFukuoka) W " 2012.01.17 '* 処理ファイル名 '* 引数内容 :シート番号,選択範囲 '* 呼び出し例:Call Rangeselect_clear(1,"A1:B5") '***************************************************************************** Dim oSheet As Object oSheet = ThisComponent.Sheets(SheetNo) oSheet.getCellRangeByName(DataArea).clearContents(1+2+4+16) '内容消去 End Sub Sub Search_AEnd(SheetNo as integer,RetsuCell as string,bangoukbn as integer) '***************************************************************************** '* '* 機能 : アクティブ範囲の最終行を返す(表組の最終行など) '* 備考 : シート番号,列座標『(例)A1』,戻り値番号区分(行番号:1 セル位置:2) '***************************************************************************** '* 作成 : JAFukuoka) W " 2012.02.28 '* 処理ファイル名: '* 呼び出し例: Call Search_AEnd(0,"A1",1) 'シート0のA列を基準にアクティブ範囲の最終行を返す '***************************************************************************** Dim oSheet As Object Dim oRange As Object Dim oAarea As Object oSheet = ThisComponent.Sheets(SheetNo) oRange = oSheet.getCellRangeByName(RetsuCell) oAarea = oSheet.createCursorByRange(oRange) oAarea.gotoEndOfUsedArea(True) End_Row = oAarea.Rows.Count If bangoukbn = 1 then End_Row = End_Row '戻り値:行番号を返します。(A3にデータがあった場合、3を返します) Else End_Row = End_Row - 1 '戻り値:セル指定用行番号。(A3にデータがあった場合、2を返します) End if End Sub Sub Search_DEnd(SheetNo as integer,Col as integer,Bangoukbn as integer) '***************************************************************************** '* '* 機能 : 指定列データの最終行番号を取得(出力する行番号はセルの行番号とセル位置を選択可) '* 引数 : シート番号・列番号『(例)A=0』・戻り値番号区分(行番号:1 セル位置:2) '***************************************************************************** '* 作成 : JAFukuoka) M " 2012.03.09 '* ・queryContentCellsメソッドの引数 '* 1:数値 2:日付と時刻 4:文字列 8:コメント 16:数式 32:セルに直接設定された書式 '* 64:スタイルによる書式(間接書式) 128:図形描画オブジェクト 256:セル内の一部の文字列に設定された書式 '* 呼び出し例: Call Search_DEnd(0,0,1) 'シート0のA列にあるデータの最終行を行番号で返す '***************************************************************************** Dim oSheet as Object Dim oColumn as Object Dim oRanges as Object Dim iCountRange as long Dim iRowBottom as long Dim oRange as Object oSheet = ThisComponent.Sheets.getByIndex(SheetNo) oColumn = oSheet.getColumns().getByIndex(Col) oRanges = oColumn.queryContentCells(1+2+4+8+16) '(引数:1と2と4と8と16に該当する値が入ったセルを指定している) ' oRanges = oColumn.queryContentCells(31) '(上記引数を合計した値31だけでも同じ動作が可能です) iCountRange = oRanges.getCount() If iCountRange = 0 Then 'データがない時は0を返します。 iRowBottom = -1 Else oRange = oRanges.getByIndex(iCountRange-1 ) iRowBottom = oRange.getRangeAddress().EndRow End If If Bangoukbn = 1 then End_Row = iRowBottom+1 '戻り値:行番号。(A3にデータがあった場合、3を返します) Else End_Row = iRowBottom '戻り値:セル指定用行番号。(A3にデータがあった場合、2を返します) End if End Sub Sub Rangecopy_paste(CSheetNo as integer,PSheetNo as integer,CopyArea as string,Pastecell as string) '***************************************************************************** '* '* 機能 : 指定範囲をコピー貼り付けします '* 引数 : コピー元シート番号,貼り付け先シート番号,コピー範囲,貼り付けセル '***************************************************************************** '* 作成 : JAFukuoka) W " 2012.02.29 '* 処理ファイル名: '* 呼び出し例:Call Rangecopy_paste(0,1,"A1:B9","A20") '***************************************************************************** Dim oSheetC As Object Dim oSheetP As Object Dim oRangeAddress As Object Dim oCellAddress As Object oSheetC = ThisComponent.Sheets(CSheetNo) 'コピー元シートを特定しています oSheetP = ThisComponent.Sheets(PSheetNo) '貼り付け先シートを特定しています oRangeAddress = oSheetC.getCellRangeByName(CopyArea).getRangeAddress() 'コピーする範囲を取得しています oCellAddress = oSheetP.getCellRangeByName(Pastecell).getCellAddress() '貼り付け位置を特定しています oSheetP.copyRange(oCellAddress, oRangeAddress) '貼り付けしています End SUb Sub Rangecopy_datapaste(CSheetNo as integer,PSheetNo as integer,CopyArea as string,PasteArea as string) '***************************************************************************** '* '* 機能 : 指定範囲をコピー貼り付けします(値貼り付け) '* 引数 : コピー元シート番号,貼り付け先シート番号,コピー範囲,貼り付けセル '***************************************************************************** '* 作成 : JAFukuoka) M " 2012.03.09 '* 処理ファイル名: '* 呼び出し例: Call Rangecopy_datapaste(0,1,"A1:B5","A1:B5") '***************************************************************************** Dim oDoc as Object Dim oSheet1 as Object Dim oSheet2 as Object Dim oCopyData as Object Dim oCopyRange as Object Dim oPasteRange as Object oDoc = ThisComponent oSheet1 = oDoc.getSheets().getByIndex(CSheetNo) 'コピー元シートを特定しています oSheet2 = oDoc.getSheets().getByIndex(PSheetNo) '貼り付け先シートを特定しています oCopyRange = oSheet1.getCellRangeByName(CopyArea) 'コピーする範囲を取得しています oPasteRange = oSheet2.getCellRangeByName(PasteArea) '貼り付け位置を特定しています oCopyData = oCopyRange.getDataArray() oPasteRange.setDataArray(oCopyData) '値の貼り付け End Sub Sub SheetShow(sSheet as String) '***************************************************************************** '* '* 機能 : シートの表示 '* 引数 : シート名 '***************************************************************************** '* 作成 : JAFukuoka) M " 2012.03.08 '* 処理ファイル名: '* 呼び出し例:Call SheetShow("シート名") '***************************************************************************** Dim oDocument As Object Dim oDispatcher As Object oDocument = ThisComponent.CurrentController.Frame oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper") Dim aArgs1(0) as new com.sun.star.beans.PropertyValue aArgs1(0).Name = "aTableName" aArgs1(0).Value = sSheet oDispatcher.executeDispatch(oDocument, ".uno:Show", "", 0, aArgs1()) End Sub Sub SheetHide(sSheet as String) '***************************************************************************** '* '* 機能 : シートの非表示 '* 引数 : シート名 '***************************************************************************** '* 作成 : JAFukuoka) M " 2012.03.08 '* 処理ファイル名: '* 呼び出し例:Call SheetHide("シート名") '***************************************************************************** Dim oDocument As Object Dim oDispatcher As Object oDocument = ThisComponent.CurrentController.Frame oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper") Dim aArgs1(0) as new com.sun.star.beans.PropertyValue aArgs1(0).Name = "aTableName" aArgs1(0).Value = sSheet oDispatcher.executeDispatch(oDocument, ".uno:Hide", "", 0, aArgs1()) End Sub Sub Sort_pro(SheetNo as integer,Sort_col as integer,Sort_area as string,Narabijun as string,Midashi as integer) '***************************************************************************** '* '* 機能   : 指定された項目で並び替えします '* 引数   : シートaE並び替え列(0〜・ソート範囲(A1:B3形式)・並び順(昇順=True 降順=False)・見出し行有無(有り:1 無し:2) '* 列番号 :ソート範囲中の並び替え列を左から順に列番号(0〜)で設定します。 ' 例)ソート範囲(B3:E20)の場合、並び替え列 B=0,C=1,D=2,E=3 '***************************************************************************** '* 作成   : JAFukuoka) W " 2012.03.12 '* 呼び出し例:Call Sort_pro(0,0,"B1:C35",true,1) 'シート0,B列,B1:C35の範囲,昇順,見出し有り  '***************************************************************************** Dim oObjSheet As Object Dim oObjRange As Object Dim aObjSortDesc(1) As New com.sun.star.beans.PropertyValue Dim aObjSortKeys(0) As New com.sun.star.util.SortField 'ソートする範囲を指定しています oObjRange =ThisComponent.Sheets(SheetNo).getCellRangeByName(Sort_area) '指定列をキーに昇順で並べ替え aObjSortKeys(0).Field = Sort_col aObjSortKeys(0).SortAscending = Narabijun 'ソートキー設定 aObjSortDesc(0).Name = "SortFields" aObjSortDesc(0).Value = aObjSortKeys() If Midashi = 1 then '見出しが有る場合と無い場合 aObjSortDesc(1).Name = "ContainsHeader" aObjSortDesc(1).Value = True Else aObjSortDesc(1).Name = "ContainsHeader" aObjSortDesc(1).Value = False End if 'ソート実行 oObjRange.sort(aObjSortDesc()) End Sub Sub Sample_Sort() '***************************************************************************** '* '* 機能   : 指定された複数の項目(3項目)で並び替えします '* サンプル例: アクティブシート・並び替え列:(A列・B列・C列)・ソート範囲:(A1:C14)・並び順:(昇順=True) ・見出し行:(無し) '***************************************************************************** '* 作成   : JAFukuoka) M 2012.03.27 '* '***************************************************************************** Dim oObjSheet As Object Dim oObjRange As Object Dim aObjSortDesc(1) As New com.sun.star.beans.PropertyValue Dim aObjSortKeys(2) As New com.sun.star.util.SortField 'ソートフィールド用配列を3つ用意しています oObjSheet = ThisComponent.CurrentController.ActiveSheet oObjRange = oObjSheet.getCellRangeByName("A1:C14") '並べ替え時の第1優先キーはA列。並び順は昇順 aObjSortKeys(0).Field = 0 'A列 aObjSortKeys(0).SortAscending = True '昇順 False 降順  '並べ替え時の第2優先キーはB列。並び順は昇順 aObjSortKeys(1).Field = 1 'B列 aObjSortKeys(1).SortAscending = True '昇順 '並べ替え時の第3優先キーはC列。並び順は昇順 aObjSortKeys(2).Field = 2 'C列 aObjSortKeys(2).SortAscending = True '昇順 'ソートキー設定 aObjSortDesc(0).Name = "SortFields" aObjSortDesc(0).Value = aObjSortKeys() 'データに「行見出し」がない場合は aObjSortDesc(1).Value = False aObjSortDesc(1).Name = "ContainsHeader" aObjSortDesc(1).Value = True '行見出しがある場合はTure '並べ替えの実行 oObjRange.sort(aObjSortDesc()) End Sub Sub SheetProtect(SheetNo as integer,PassWord as String,Kaijyokbn as integer) '***************************************************************************** '* システム名  : '* 機能      : シートの保護・解除 '* 備考      : '***************************************************************************** '* 作成   JAFukuoka) M " 2012.03.09 '* 引数内容 :シートNo,パスワード(設定しない場合は""),解除区分(設定:1、解除:2) '* 呼び出し例:Call SheetProtect(0,"",1) '***************************************************************************** Dim oDoc as Object Dim oSheet as Object oDoc = ThisComponent oSheet = oDoc.Sheets(SheetNo) If Kaijyokbn = 1 then oSheet.Protect(PassWord) 'シートの保護 Else oSheet.UnProtect(PassWord) 'シートの保護解除 End If End Sub Sub RC_sounyu(SheetNo as integer,RCNo as integer,Sounyusu as long,Gyouretukbn as integer) '***************************************************************************** '* システム名  : '* 機能      : 行・列の挿入 '* 備考      : '***************************************************************************** '* 作成   JAFukuoka) M " 2012.03.09 '* 引数内容 :シートNo,挿入開始行・列No(1行目=0、A列=0),挿入する行数・列数,挿入する行列の区分(行=1・列=2) '*呼び出し例:Call RC_sounyu(0,0,5,2) 'シート0のA列から5列挿入します '***************************************************************************** Dim oDoc as Object Dim oSheet as Object Dim oRows as Object Dim oColumns as Object If Gyouretukbn = 1 then oDoc=ThisComponent oSheet=oDoc.Sheets(SheetNo) oRows = oSheet.getRows() oRows.insertByIndex(RCNo,Sounyusu) Else oDoc=ThisComponent oSheet=oDoc.Sheets(SheetNo) oColumns = oSheet.getColumns() oColumns.insertByIndex(RCNo,Sounyusu) End if End Sub Sub RC_sakujyo(SheetNo as integer,RCNo as integer,Sakujyosu as long,Gyouretukbn as integer) '***************************************************************************** '* システム名  : '* 機能      : 行・列の削除 '* 備考      : '***************************************************************************** '* 作成   JAFukuoka) M " 2012.03.09 '* 引数内容 :シートNo,削除開始行.列No(1行目=0、A列=0), 削除する行数・列数, 削除する行・列の区分(行=1・列=2) '*呼び出し例:Call RC_sounyu(0,0,5,2) 'シート0のA列から5列挿入します '***************************************************************************** Dim oDoc as Object Dim oSheet as Object Dim oRows as Object Dim oColumns as Object If Gyouretukbn = 1 then oDoc=ThisComponent oSheet=oDoc.Sheets(SheetNo) oRows = oSheet.getRows() oRows.removeByIndex(RCNo,Sakujyosu) Else oDoc=ThisComponent oSheet=oDoc.Sheets(SheetNo) oColumns = oSheet.getColumns() oColumns.removeByIndex(RCNo,Sakujyosu) End if End Sub Sub RC_Visible(SheetNo as integer,RCNo as integer,Gyouretukbn as integer) '***************************************************************************** '* システム名  : '* 機能      : 行・列の表示 '* 備考      : '***************************************************************************** '* 作成   JAFukuoka) M " 2012.03.09 '* 引数内容 :シートNo,表示する行・列No(1行目=0、A列=0), 表示する行列の区分(行=1・列=2) '*呼び出し例: '***************************************************************************** Dim oDoc as Object Dim oSheet as Object If Gyouretukbn = 1 then oDoc = ThisComponent oSheet = oDoc.getSheets().getByIndex(SheetNo) oSheet.Rows(RCNo).isVisible=true Else oDoc = ThisComponent oSheet = oDoc.getSheets().getByIndex(SheetNo) oSheet.Columns(RCNo).isVisible=true End if End Sub Sub RC_Hide(SheetNo as integer,RCNo as integer,Gyouretukbn as integer) '***************************************************************************** '* システム名  : '* 機能      : 行・列の非表示 '* 備考      : '***************************************************************************** '* 作成   JAFukuoka) M " 2012.03.09 '* 引数内容 :シートNo,非表示にする行.列No(1行目=0、A列=0),非表示する行・列の区分(行=1・列=2) '*呼び出し例: '***************************************************************************** Dim oDoc as Object Dim oSheet as Object If Gyouretukbn = 1 then oDoc = ThisComponent oSheet = oDoc.getSheets().getByIndex(SheetNo) oSheet.Rows(RCNo).isVisible=false Else oDoc = ThisComponent oSheet = oDoc.getSheets().getByIndex(SheetNo) oSheet.Columns(RCNo).isVisible=false End if End Sub Sub Auto_Filter() '***************************************************************************** '* '* 機能 : アクティブ範囲にオートフィルタの設定を行います。 '* 備考 : '***************************************************************************** '* 作成 : JAFukuoka) W " 2012.03.28 '* 処理ファイル名: '*呼び出し例: call Auto_filter '***************************************************************************** Dim oDocument as Object Dim oDispatcher as Object oDocument = ThisComponent.CurrentController.Frame oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper") 'オートフィルタ実行 oDispatcher.executeDispatch(oDocument, ".uno:DataFilterAutoFilter", "", 0, Array()) End Sub Sub Auto_Filter_check() '***************************************************************************** '* '* 機能 : 『データベース範囲の指定』で設定した範囲にオートフィルタが設定されているか?を判定 '* 備考 : ツール→「データ」→「範囲の指定」→「データベース範囲の指定」で範囲名を設定可能。(例ではRange1) ' 上記設定で、名前を付けたデータベース範囲でオートフィルタをされているかどうか判定。 '***************************************************************************** '* 作成 : JAFukuoka) M " 2012.03.29 '***************************************************************************** Dim oDBArea as Object oDBArea = ThisComponent.DatabaseRanges.getByName("Range1") If oDBArea.AutoFilter Then MsgBox "オートフィルタ有効" Else MsgBox "オートフィルタ無効" End If End Sub Sub ActiveSheetNo(sheetno) '***************************************************************************** '* '* 機能 : 指定されたシートをアクティブにします '* 備考 : ' '***************************************************************************** '* 作成 : JAFukuoka) W " 2012.04.19 '***************************************************************************** Dim oDoc as Object Dim oSheet as Object Dim oController as Object oDoc = ThisComponent oController = oDoc.getCurrentController() oSheets = oDoc.getSheets() oController.setActiveSheet(oSheets(sheetno)) End sub Sub ActiveSheet_Print(busuu as integer) '***************************************************************************** '* '* 機能 : アクティブシートを印刷します。 '* 備考 : '***************************************************************************** '* 作成 : JAFukuoka) M " 2012.04.15 '* 処理ファイル名: '* 引数内容 :部数 '* 呼び出し例:Call ActiveSheet_Print(2)  'アクティブシートを2部印刷します。 '***************************************************************************** Dim aPrinter(0) as object aPrinter(0) = new com.sun.star.beans.PropertyValue aPrinter(0).Name = "CopyCount" aPrinter(0).Value = busuu ThisComponent.print(aPrinter()) End Sub