create a new page, using OOobbs3/43 as a template.
Front page
Search
掲示板
Reload
Help
Browse Log
掲示板の使い方
OOo 掲示板3
OOo 掲示板2
OOo 掲示板
掲示板
雑談掲示板
New
List of pages
Recent changes
Backup
簡単ヘルプ
整形ルール
Start:
** [[OOobbs3/43]] [#k90405a8]
-''サマリ'': オート Sum っぽいマクロ
-''環境'': Calc
-''状態'': 投稿
-''投稿者'': [[はにゃ?]]
-''投稿日'': 2011-01-05 (水) 21:41:33
*** 質問 [#obb2afb0]
オート Sum に対応するコマンドが見つからないので issue を...
それらしくマクロで書いてみた。
#code(basic){{
Sub AutoSumForCalc
oDoc = ThisComponent
If NOT oDoc.supportsService("com.sun.star.sheet.Spreads...
nCellFlags = com.sun.star.sheet.CellFlags
nCellType = com.sun.star.table.CellContentType
oSelection = oDoc.getCurrentSelection()
If oSelection.supportsService("com.sun.star.sheet.Sheet...
' single cell mode
oCell = oSelection
oSheet = oCell.getSpreadsheet()
aCellAddr = oCell.getCellAddress()
oCellRange = oSheet.getCellRangeByPosition( _
aCellAddr.Column, 0, aCellAddr.Column, aCellAddr....
oRanges = oCellRange.queryContentCells(nCellFlags.VAL...
If oRanges.getCount() Then
oRange = oRanges.getByIndex(oRanges.getCount() - 1)
aRangeAddr = oRange.getRangeAddress()
If aRangeAddr.EndRow < aCellAddr.Row - 1 Then
oRange = oSheet.getCellRangeByPosition( _
aRangeAddr.StartColumn, aRangeAddr.StartRow, _
aRangeAddr.EndColumn, aCellAddr.Row - 1)
End If
sFormula = "=SUM(" & GetRangeAddress(oRange) & ")"
oCell.setFormula(sFormula)
ToEditMode(oDoc)
End If
ElseIf oSelection.supportsService("com.sun.star.sheet.S...
oCellRange = oSelection
aRangeAddr = oCellRange.getRangeAddress()
' check all last rows are empty
bAllEmpty = True
nRow = aRangeAddr.EndRow - aRangeAddr.StartRow
For i = 0 To (aRangeAddr.EndColumn - aRangeAddr.Start...
oCell = oCellRange.getCellByPosition(i, nRow)
If oCell.getType() <> nCellType.EMPTY Then
bAllEmpty = False
End If
Next
If bAllEmpty Then
' set sum in each cell of the last row
If (aRangeAddr.EndRow - aRangeAddr.StartRow) > 0 Then
For i = 0 To (aRangeAddr.EndColumn - aRangeAddr.S...
oCell = oCellRange.getCellByPosition(i, nRow)
oCellRange2 = oCellRange.getCellRangeByPosition...
sFormula = "=SUM(" & GetRangeAddress(oCellRange...
oCell.setFormula(sFormula)
Next
End If
Else
oSheet = oCellRange.getSpreadsheet()
On Error GoTo IndexOutOfBoundExceptionHandle
For i =aRangeAddr.StartColumn To aRangeAddr.EndColu...
oCell = oSheet.getCellByPosition(i, nRow)
oRange = oSheet.getCellRangeByPosition(i, aRangeA...
sFormula = "=SUM(" & GetRangeAddress(oRange) & ")"
oCell.setFormula(sFormula)
Next
IndexOutOfBoundExceptionHandle:
End If
End If
End Sub
Function GetRangeAddress(oRange As Object) As String
sAddress = ""
If oRange.supportsService("com.sun.star.sheet.SheetCell...
aRangeAddr = oRange.getRangeAddress()
sAddress = ConvertToColumn(aRangeAddr.StartColumn) & ...
ConvertToColumn(aRangeAddr.EndColumn) & CStr(aRan...
End If
GetRangeAddress = sAddress
End Function
Function ConvertToColumn(nColumn As Long) As String
nCol = nColumn
nMod = nCol mod 26
sAddr = chr(65 + nMod)
nCol = (nCol - nMod) / 26
While nCol > 26
nMod = nCol mod 26
sAddr = chr(65 + nMod - 1) & sAddr
nCol = (nCol - nMod) / 26
WEnd
If nCol >= 1 Then sAddr = chr(65 + nCol - 1) & sAddr
ConvertToColumn = sAddr
End Function
Sub ToEditMode(oDoc)
dispatcher = createUnoService("com.sun.star.frame.Dispa...
dispatcher.executeDispatch(oDoc.getCurrentController(), _
".uno:SetInputMode", "", 0, Array())
End Sub
}}
実行後の選択状態などを同じにしようとしたが方法がない。
Dim n As Long, m As Long, p As Long
n = 25
m = 26
p = n / m
このとき p = 1 になる…せいで手間取ったり…。
拡張機能パッケージを作成しました。
&ref(AutoSumForCalc-0.0.1.oxt);
使い方
+ 拡張機能パッケージを拡張機能マネージャからインストール...
+ Calc のドキュメントを作成します。
+ ツール - カスタマイズ - キーボードを選択します。
+ ショートカットキーに割り当てたいキーを選択します。
+ 左下の範囲から、OpenOffice.org マクロ - user - mytools_...
+ 中央の機能で AutoSumForCalc を選択。
+ 右上にある変更ボタンをクリック。
+ OK ボタンをクリックしてダイアログを閉じます。
仕様について
- マクロライブラリ名: mytools_AutoSumForCalc
- マクロ名: mytools_AutoSumForCalc.Module1.AutoSumForCalc
実行後の挙動が既存のオート Sum とは異なります。
- 戻る機能を利用したときに一段階で元にもどらないことがあ...
- 単一セルを選択状態で実行したとき、実行後にセルが編集状...
-- アクセシビリティ API を利用すれば・・・。
- 複数の列が選択されている状態のとき、実行後に範囲のセル...
-- これは、範囲を選択させるとセルカーソルが範囲の左上に移...
- Alt + = キーにショートカットが割当てていない。
-- Alt + = キーは OOo ではショートカットキーとして利用で...
ショートカットキー用のコンフィグファイルを作成しましたが...
ToDo
- 列方向に sum 対象が見つからないときに行方向を探す
*** 回答 [#lce64e6a]
#comment
*** 感想,コメント,メモ [#y1c4d5aa]
#comment
End:
** [[OOobbs3/43]] [#k90405a8]
-''サマリ'': オート Sum っぽいマクロ
-''環境'': Calc
-''状態'': 投稿
-''投稿者'': [[はにゃ?]]
-''投稿日'': 2011-01-05 (水) 21:41:33
*** 質問 [#obb2afb0]
オート Sum に対応するコマンドが見つからないので issue を...
それらしくマクロで書いてみた。
#code(basic){{
Sub AutoSumForCalc
oDoc = ThisComponent
If NOT oDoc.supportsService("com.sun.star.sheet.Spreads...
nCellFlags = com.sun.star.sheet.CellFlags
nCellType = com.sun.star.table.CellContentType
oSelection = oDoc.getCurrentSelection()
If oSelection.supportsService("com.sun.star.sheet.Sheet...
' single cell mode
oCell = oSelection
oSheet = oCell.getSpreadsheet()
aCellAddr = oCell.getCellAddress()
oCellRange = oSheet.getCellRangeByPosition( _
aCellAddr.Column, 0, aCellAddr.Column, aCellAddr....
oRanges = oCellRange.queryContentCells(nCellFlags.VAL...
If oRanges.getCount() Then
oRange = oRanges.getByIndex(oRanges.getCount() - 1)
aRangeAddr = oRange.getRangeAddress()
If aRangeAddr.EndRow < aCellAddr.Row - 1 Then
oRange = oSheet.getCellRangeByPosition( _
aRangeAddr.StartColumn, aRangeAddr.StartRow, _
aRangeAddr.EndColumn, aCellAddr.Row - 1)
End If
sFormula = "=SUM(" & GetRangeAddress(oRange) & ")"
oCell.setFormula(sFormula)
ToEditMode(oDoc)
End If
ElseIf oSelection.supportsService("com.sun.star.sheet.S...
oCellRange = oSelection
aRangeAddr = oCellRange.getRangeAddress()
' check all last rows are empty
bAllEmpty = True
nRow = aRangeAddr.EndRow - aRangeAddr.StartRow
For i = 0 To (aRangeAddr.EndColumn - aRangeAddr.Start...
oCell = oCellRange.getCellByPosition(i, nRow)
If oCell.getType() <> nCellType.EMPTY Then
bAllEmpty = False
End If
Next
If bAllEmpty Then
' set sum in each cell of the last row
If (aRangeAddr.EndRow - aRangeAddr.StartRow) > 0 Then
For i = 0 To (aRangeAddr.EndColumn - aRangeAddr.S...
oCell = oCellRange.getCellByPosition(i, nRow)
oCellRange2 = oCellRange.getCellRangeByPosition...
sFormula = "=SUM(" & GetRangeAddress(oCellRange...
oCell.setFormula(sFormula)
Next
End If
Else
oSheet = oCellRange.getSpreadsheet()
On Error GoTo IndexOutOfBoundExceptionHandle
For i =aRangeAddr.StartColumn To aRangeAddr.EndColu...
oCell = oSheet.getCellByPosition(i, nRow)
oRange = oSheet.getCellRangeByPosition(i, aRangeA...
sFormula = "=SUM(" & GetRangeAddress(oRange) & ")"
oCell.setFormula(sFormula)
Next
IndexOutOfBoundExceptionHandle:
End If
End If
End Sub
Function GetRangeAddress(oRange As Object) As String
sAddress = ""
If oRange.supportsService("com.sun.star.sheet.SheetCell...
aRangeAddr = oRange.getRangeAddress()
sAddress = ConvertToColumn(aRangeAddr.StartColumn) & ...
ConvertToColumn(aRangeAddr.EndColumn) & CStr(aRan...
End If
GetRangeAddress = sAddress
End Function
Function ConvertToColumn(nColumn As Long) As String
nCol = nColumn
nMod = nCol mod 26
sAddr = chr(65 + nMod)
nCol = (nCol - nMod) / 26
While nCol > 26
nMod = nCol mod 26
sAddr = chr(65 + nMod - 1) & sAddr
nCol = (nCol - nMod) / 26
WEnd
If nCol >= 1 Then sAddr = chr(65 + nCol - 1) & sAddr
ConvertToColumn = sAddr
End Function
Sub ToEditMode(oDoc)
dispatcher = createUnoService("com.sun.star.frame.Dispa...
dispatcher.executeDispatch(oDoc.getCurrentController(), _
".uno:SetInputMode", "", 0, Array())
End Sub
}}
実行後の選択状態などを同じにしようとしたが方法がない。
Dim n As Long, m As Long, p As Long
n = 25
m = 26
p = n / m
このとき p = 1 になる…せいで手間取ったり…。
拡張機能パッケージを作成しました。
&ref(AutoSumForCalc-0.0.1.oxt);
使い方
+ 拡張機能パッケージを拡張機能マネージャからインストール...
+ Calc のドキュメントを作成します。
+ ツール - カスタマイズ - キーボードを選択します。
+ ショートカットキーに割り当てたいキーを選択します。
+ 左下の範囲から、OpenOffice.org マクロ - user - mytools_...
+ 中央の機能で AutoSumForCalc を選択。
+ 右上にある変更ボタンをクリック。
+ OK ボタンをクリックしてダイアログを閉じます。
仕様について
- マクロライブラリ名: mytools_AutoSumForCalc
- マクロ名: mytools_AutoSumForCalc.Module1.AutoSumForCalc
実行後の挙動が既存のオート Sum とは異なります。
- 戻る機能を利用したときに一段階で元にもどらないことがあ...
- 単一セルを選択状態で実行したとき、実行後にセルが編集状...
-- アクセシビリティ API を利用すれば・・・。
- 複数の列が選択されている状態のとき、実行後に範囲のセル...
-- これは、範囲を選択させるとセルカーソルが範囲の左上に移...
- Alt + = キーにショートカットが割当てていない。
-- Alt + = キーは OOo ではショートカットキーとして利用で...
ショートカットキー用のコンフィグファイルを作成しましたが...
ToDo
- 列方向に sum 対象が見つからないときに行方向を探す
*** 回答 [#lce64e6a]
#comment
*** 感想,コメント,メモ [#y1c4d5aa]
#comment
Page: