人気ブログランキング |
<   2010年 07月 ( 11 )   > この月の画像一覧
ショートカット作成時に「 - ショートカット」をつけないようにする
Windows7だとドラッグアンドドロップでショートカットを作ると「a.exe - ショートカット」という名前になります。
XP以前だと「a.exeへのショートカット」という名前になってましたね。

この末尾の「 - ショートカット」や「へのショートカット」を不可させない方法です。

レジストリで下記の値を 00 00 00 00 にすればいいようです。

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer]
"link"=hex:00,00,00,00


これで再ログインすれば設定が有効になります。
by jehoshaphat | 2010-07-29 23:30 | 豆知識
(OpenOffice Basic)Calcで枠線を引く方法
OpenOffice Basic で Calc のセルの枠線(罫線)を引く方法です。

先にBorderLineオブジェクトを作ってから、セルにセットするという流れになるようです。
Dim oSheet as object
oSheet = ThisComponent.Sheets.getByName("Sheet1")
Dim oCell as object
oCell = oSheet.getCellRangeByName("C1")
'BorderLineオブジェクト生成
Dim l As New com.sun.star.table.BorderLine
'枠線の幅
l.OuterLineWidth = 35
'セルに枠線をセット
oCell.LeftBorder = l

セルのLeftBorder, RightBorder, TopBorder, BottomBorder, プロパティーに BorderLine オブジェクトをセットするとそれぞれの辺に枠線がひけます。
セルだけでなく、CellRange (セル範囲)に対しても指定できるようですね。

ちなみに、OuterLineWidthの値が 35 の時がCalcのGUIで設定した時の 1.00 pt になるようです。

参考:
OOoBasic/Calc/border
by jehoshaphat | 2010-07-29 23:26 | OpenOffice
(OpenOffice Basic)Calcでセルのフォントの設定を変更する
OpenOffice Basic で Calc のセルフォントの設定を変更する方法です。
Dim oSheet as object
oSheet = ThisComponent.Sheets.getByName("Sheet1")
Dim oCell as object
oCell = oSheet.getCellRangeByName("C1")
oCell.setString("あああ")
 
'日本語フォント指定
oCell.CharFontNameAsian = "MS 明朝"
'日本語の場合のフォントサイズ指定
oCell.CharHeightAsian = 20
'日本語フォント太字設定
oCell.CharWeightAsian =com.sun.star.awt.FontWeight.BLACK
'フォントカラー設定
oCell.CharColor = RGB( 255, 0, 0 )


下記のように英数字用と日本語用の2種類のプロパティがあるみたいです。(基本的に英字用プロパティにAsianを付けると日本語用の設定になるようです。)

英数字用の設定プロパティ
 フォント:CharFontName
 サイズ:CharHeight
 太字:CharWeight
日本語用の設定プロパティ
 フォント:CharFontNameAsian
 サイズ:CharHeightAsian
 太字:CharWeightAsian

なお、太字については列挙型でも指定できますし、数値でも指定できます。(100が等倍)
太字の列挙型は、com.sun.star.awt.FontWeight内で定義されています。
どんな列挙型があるかは、api: Constants' Group FontWeightを参照してください。

参考:
OOoBasic/Calc/font
by jehoshaphat | 2010-07-29 23:25 | OpenOffice
(OpenOffice Basic)Calcでセルテキストの配置を変える
OpenOffice Calc で セルの書式設定 → 配置タブ でやっている設定を OpenOffice Basic で実現する方法です。

とりあえず下記にサンプルを載せますが、セルオブジェクトのOrientationで細かく設定できるようです。
Dim oSheet as object
oSheet = ThisComponent.Sheets.getByName("Sheet1")
Dim oCell as object
oCell = oSheet.getCellRangeByName("C1")
oCell.setString("あああ")
 
'○テキストの向きの設定
'垂直(縦書きにチェックを入れたのと同義)
oCell.Orientation = com.sun.star.table.CellOrientation.STACKED
'横向き(270度回転)
oCell.Orientation = com.sun.star.table.CellOrientation.TOPBOTTOM
'横向き(90度回転)
oCell.Orientation = com.sun.star.table.CellOrientation.BOTTOMTOP
 
'○テキストの配置の設定
'水平での中央揃え
oCell.HoriJustify = com.sun.star.table.CellHoriJustify.CENTER
'垂直での中央揃え
oCell.VertJustify = com.sun.star.table.CellVertJustify.CENTER
 
'セルの大きさに合わせて縮小
ShrinkToFit = True

より詳しくは下記リンクを参照。
表計算ドキュメントの書式設定 - OpenOffice.org Wiki
OOoBasic/Calc/font
api: Enum CellOrientation

(高熱の夏風邪ひいたり、イベントで忙しかったりと最近新記事をアップできてない3流PGでした。)
by jehoshaphat | 2010-07-29 23:23 | OpenOffice
(OpenOffice Basic)自身のファイルパスを表示する
マクロを動かしている自身のファイルパスをとるときは下記のようにできます。(参考先そのままですが...)
Sub Macro01
Dim oUrl As String
'oUrl = StarDesktop.CurrentComponent.getURL
oUrl = ThisComponent.getURL
MsgBox oUrl
MsgBox ConvertFromUrl(oUrl)
End Sub

パスの取得は

StarDesktop.CurrentComponent.getURL

でも

ThisComponent.getURL

どっちでもOKのようです。

ただ、取得したパスはエンコードされたURL形式(file://...)なので注意が必要です。

ConvertFromUrl関数で、URL形式をWindowsのパス形式(バックスラッシュ形式)にしてくれます。


しかし、ファイルのフルパスからディレクトリパスを取れそうな関数はぱっと見つからなかったので、地道に文字列操作することにしました。
(もしそのような関数あれば教えてください)
Dim strTest As String
strTest = "c:\aaaa\bbb\ccc.ods"
 
Dim iCnt As Integer
Dim iRes As Integer
iCnt = 1
 
Do While iCnt <> 0
iCnt = InStr(iCnt+1, strTest , "\" )
If iCnt <> 0 Then
iRes = iCnt
End If
Loop
 
strTest = Left(strTest, iRes)
 
MsgBox strTest


参考:
ファイル名を表示する - OpenOffice.org Basic
by jehoshaphat | 2010-07-13 22:58 | OpenOffice
(OpenOffice Basic)テキストファイルの書き込み
OpenOffice Basicを使ってのテキストファイルへのデータ出力方法です。

サンプルそのままですが、この辺はVBAと対して変わらないようですね。
Dim FileNo As Integer
Dim CurrentLine As String
Dim Filename As String
 
Filename = "c:\data.txt" ' ファイル名
FileNo = Freefile ' ファイルハンドル作成
 
Open Filename For Output As #FileNo ' ファイルを書き込みモードで開く
Print #FileNo, "This is a line of text" ' 1レコード書き出し
Print #FileNo, "This is another line of text" ' 1レコード書き出し
Close #FileNo ' ファイルを閉じる


参考:
ファイルおよびディレクトリ (OpenOffice.org 実行時ライブラリ) - OpenOffice.org Wiki:
by jehoshaphat | 2010-07-13 22:54 | OpenOffice
(OpenOffice Basic)ファイル保存ダイアログを表示する

ファイルの保存ダイアログを表示するには下記のようなコードにすればいいようです。
Dim oFilePicker As Object
Dim nDlgResult As Integer
Dim sFiles() As String
Dim sFilename As String
'dialogs.FilePicker でダイアログが使える
oFilePicker = createUnoService("com.sun.star.ui.dialogs.FilePicker")
' 保存するダイアログの場合、このように設定
oFilePicker.initialize(Array(com.sun.star.ui.dialogs.TemplateDescription.FILESAVE_SIMPLE))
 
' ダイアログの初期化
oFilePicker.Title = "CSVデータ保存"
oFilePicker.appendFilter( "CSVファイル (*.csv)", "*.csv" )
oFilePicker.setCurrentFilter( "CSVファイル (*.csv)" )
oFilePicker.setDefaultName("デフォルトファイル名")
'ダイアログ表示
nDlgResult = oFilePicker.execute()
' 開く(OK)が押された場合は、1が返される
IF nDlgResult <> 1 Then
Exit Sub
END IF
sFiles() = oFilePicker.getFiles()
sFilename = sFiles(0)


参考:
OpenOffice.org Basic - Wikibooks
api: Service FilePicker
by jehoshaphat | 2010-07-10 13:53 | OpenOffice
(OpenOffice Basic)Calcでセルの取得と値の取得・設定
まず、セルを取得(アクセス)する方法です。

VBAだと下記のようになります。
'単一セルをセル名にて指定するにはこうなります。
Dim oCell As Object
Cell = ThisComponent.Sheets("Sheet1").getCellRangeByName("C1")
 
'複数セルをセル名で指定するにはこうなります。
Dim oRange0 As Object
oRange0 = ThisComponent.Sheets(0).getCellRangeByName("A3:C5")
 
'セルレンジ(セル範囲)をインデックスにて選択する場合はこうなります。(0からの絶対値になります)
Dim oRange1 As Object
oRange1 = ThisComponent.Sheets(0).getCellRangeByPosition(0,2,2,4) 'A3:C5を選択
'↑で取得したセル範囲にアクセスするには下記のようにします。
MsgBox oRange1.getCellByPosition(0,0).getString 'A3のセル値を表示
MsgBox oRange1.getCellByPosition(1,0).getString 'B3のセル値を表示
MsgBox oRange1.getCellByPosition(2,0).getString 'C3のセル値を表示
MsgBox oRange1.getCellByPosition(0,1).getString 'A4のセル値を表示
MsgBox oRange1.getCellByPosition(1,1).getString 'B4のセル値を表示
MsgBox oRange1.getCellByPosition(2,1).getString 'C4のセル値を表示
MsgBox oRange1.getCellByPosition(0,2).getString 'A5のセル値を表示
MsgBox oRange1.getCellByPosition(1,2).getString 'B5のセル値を表示
MsgBox oRange1.getCellByPosition(2,2).getString 'C5のセル値を表示

参考:
取得した範囲内のセルにアクセスする - OpenOffice.org Basic
OOoBasic/Calc/cell


また、セル範囲の一行を配列として取得するには、ScCellRangeObjオブジェクトのgetDataArrayメソッドを使えばいいようです。
こんな感じです。
Dim Sheet As Object
Dim DataArray()
Dim RowDataArray()
 
Sheet = ThisComponent.Sheets(0)
DataArray() = Sheet.getCellRangeByPosition(0, 0, 1, 1).getDataArray()
 
RowDataArray() = DataArray(0)
' RowDataArray(0) = Sheet.getCellByPosition(0, 0).Value(1行1列目)
' RowDataArray(1) = Sheet.getCellByPosition(1, 0).Value(1行2列目)
 
RowDataArray() = DataArray(1)
' RowDataArray(0) = Sheet.getCellByPosition(0, 1).Value(2行1列目)
' RowDataArray(1) = Sheet.getCellByPosition(1, 1).Value(2行2列目)


参考:
ScCellRangeObj - OpenOffice.org リファレンス ScCellRangeObj.getDataArray メソッドの解説。

ちなみに、セルの値、文字列、数式を取得するには、下記のメソッドを使えます。

ScCellObj.getValue 値(DOUBLE型)を取得
ScCellObj.getString 表示文字列(String型)を取得
ScCellObj.getFormula 数式(String型)を取得

セルに値、文字列、数式をセットするには、setValue , setString , setFormula が使えます。


参考:
セルにデータを入力する - OpenOffice.org Basic



追記:------------------------------------

複数のセルを選択して、それらに一気に値を入れるには setDataArray メソッドを使います。((OpenOffice Basic)Calcでセルアクセスの高速化でもちょこっと書いてます)


例えば、A1:B3 の範囲で以下のような値を入れようとするには、以下のコードのようにします。

| A |
1|100|
2|101|
3|102|


Dim oSheet As Object
'シート選択
oSheet = ThisComponent.Sheets(1)
 
'データを入れるための配列作成
Dim aryData(2)
Dim i As Integer
For i = 0 To Ubound( aryData )
aryData(i) = Array( 100 + i )
Next i
'セル範囲に配列化されたデータ挿入。
oSheet.getCellRangeByName("A1:A3").setDataArray(aryData)



例えば、A1:B3 の範囲で以下のような値を入れようとするには、以下のコードのようにします。

入れたい値:
| A | B |
1|100|200|
2|101|201|
3|102|202|



Dim oSheet As Object
'シート選択
oSheet = ThisComponent.Sheets(1)
 
'データを入れるための配列作成
Dim aryData(2)
Dim i As Integer
For i = 0 To Ubound( aryData )
aryData(i) = Array( 100 + i , 200 + i)
Next i
'セル範囲に配列化されたデータ挿入。
oSheet.getCellRangeByName("A1:B3").setDataArray(aryData)


コードを見てわかるように、挿入するデータのは行単位と、列単位にそれぞれ配列(ジャグ配列つまり配列の配列)が必要になるということですね。


セル範囲の行列数と、配列の要素数が異なると、「BASICランタイムエラー 例外が発生しました。Type: com.sun,star.uno.RuntimeException Message:。」というエラーになります。
このあたりは注意が必要ですね。



また、セルの値や書式を削除するには、clearContents メソッドを使います。
引数に、クリアする内容をフラグで指定します。フラグに意味は以下のような感じ。

値 :フラグ :説明
1 :VALUE :日付や時刻として書式設定されていない数値
2 :DATETIME :日付や時刻として書式設定されている数値
4 :STRING :文字列
8 :ANNOTATION :セルに付けられたコメント
16 :FORMULA :計算式
32 :HARDATTR :セルに直接指定された書式
64 :STYLES :間接的に指定された書式
128:OBJECT :セルに配置された描画オブジェクト
256:EDITATTR :セル内の一部のテキストに対してのみ指定された書式

例えば、数値と文字列、計算式を削除するには以下のようにします。


Dim oCell As Object
'シート選択
oSheet = ThisComponent.Sheets(1)
'数値と文字列、計算式削除
oSheet.getCellRangeByName("A1:B2").clearContents(1+2+4+16)

すべての内容をクリアするにはフラグの値を全て加算した 511 を指定します。

参考:
ScCellRangeObj - OpenOffice.org リファレンス
by jehoshaphat | 2010-07-10 13:51 | OpenOffice
(OpenOffice Basic)現在選択しているセルの位置を得る
OpenOffice Basic(3.2)でユーザーが現在選択しているセル(カレントセル)の位置を得る方法です。

Dim oActiveCell As Object
'現在選択中のセルを取得
oActiveCell = ThisComponent.CurrentSelection
MsgBox "シート:" & oActiveCell.CellAddress.Sheet & _
" 列:" & oActiveCell.CellAddress.Column & _
" 行:" & oActiveCell.CellAddress.Row

また、CellAddressオブジェクトで、セルの位置(アドレス)を取得できます。
CellAddressについては、ここが参考になります。

ただし、上記の方法は、セルを一つだけ選択した場合に限ります。
複数のセル選択を取得する場合は、セルを複数選択したか一つだけ選択したかの切り分けが必要です。
その切り分け方法ですが、ThisComponent.CurrentSelection.ImplementationName で判断できるようです。
ImplementationName が ScCellObj の場合は、セル一つの場合、ScCellRangeObj の場合はセルレンジ(複数セルをドラッグ選択したとき)、ScCellRangesObj の場合はセルレンジが複数(Ctrlキーとかでの複数選択)となります。

一応サンプルを下記に載せます。
Dim oSheet as object
oSheet = ThisComponent.Sheets.getByName("Sheet1")
 
Dim oActiveCell As Object
oActiveCell = ThisComponent.CurrentSelection
 
'1セルの場合
If oActiveCell.ImplementationName = "ScCellObj" Then
oActiveCell.setString("セルひとつ")
 
'セルRangeひとつの場合
ElseIf oActiveCell.ImplementationName = "ScCellRangeObj" Then
For i = oActiveCell.RangeAddress.StartRow To oActiveCell.RangeAddress.EndRow
For j = oActiveCell.RangeAddress.StartColumn To oActiveCell.RangeAddress.EndColumn
oSheet.getCellByPosition( j , i ).setString("セルRangeひとつ")
Next j
Next i
 
'セルRangeが複数の場合
ElseIf oActiveCell.ImplementationName = "ScCellRangesObj" Then
For i = 0 To UBound(oActiveCell.RangeAddresses)
For j = oActiveCell.RangeAddresses(i).StartRow To oActiveCell.RangeAddresses(i).EndRow
For k = oActiveCell.RangeAddresses(i).StartColumn To oActiveCell.RangeAddresses(i).EndColumn
oSheet.getCellByPosition( k , j ).setString("セルRange複数")
Next k
Next j
Next i
 
'セル選択されていない時
Else
 
End If

上記は選択しているセルに一つずつアクセスして文字列をセットしている例です。

ScCellRangeObj や ScCellRangesObj オブジェクトのメンバには ScCellObj とほぼ同じようなメンバみたいです。
なので、フォントの設定やセルのプロパティの設定は一括してできます。
下記は選択されているセルの背景色を一気に変える例です。

Dim oSheet as object
oSheet = ThisComponent.Sheets.getByName("Sheet1")
 
Dim oActiveCell As Object
oActiveCell = ThisComponent.CurrentSelection
 
If oActiveCell.ImplementationName = "ScCellObj" Then
'1セルの場合
oActiveCell.CellBackColor = RGB(255,0,0)
ElseIf oActiveCell.ImplementationName = "ScCellRangeObj" Then
'セルRangeひとつの場合
oActiveCell.CellBackColor = RGB(255,0,0)
ElseIf oActiveCell.ImplementationName = "ScCellRangesObj" Then
'セルRangeが複数の場合
oActiveCell.CellBackColor = RGB(255,0,0)
Else
'セル選択されていない時
End If



ただ、セルに値をセットする時に、ScCellRangeObj と ScCellRangesObj は setDataArray 、setFormulaArray で配列で渡してあげないといけないようです。
この方法を使うと、かなり高速にセルに値をセットできます。詳しくは、セルアクセスの高速化として後ほど書きたいと思います。

参考:
選択したセル範囲のアドレスを表示する - OpenOffice.org Basic
by jehoshaphat | 2010-07-04 12:41 | OpenOffice
(OpenOffice Basic)Calcシートの保護
OpenOffice Basic(3.2) で Calc のシートの保護をかける方法です。

Dim oSheet As Object
oSheet = ThisComponent.Sheets(0)
'シートの保護
oSheet.Protect("passwd")  'パスワード passwd でシート保護
'シートの保護の解除
oSheet.Unprotect ("passwd")

参考:
せっち屋えぶろーぐ:OpenOffice.org
by jehoshaphat | 2010-07-04 12:37 | OpenOffice