Cell操作
[ Copy・Move(2) ]
Sub CopyPasteSample()
Dim oFrame as object
Dim dispatcher as object
'
oFrame = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
'
dispatcher.executeDispatch(oFrame, ".uno:Copy", "", 0, Array())
'
Dim oArgs2(0) as new com.sun.star.beans.PropertyValue
oArgs2(0).Name = "ToPoint"
oArgs2(0).Value = "$B$5"
dispatcher.executeDispatch(oFrame, ".uno:GoToCell", "", 0, oArgs2())
'
Dim oArgs3(5) as new com.sun.star.beans.PropertyValue
oArgs3(0).Name = "Flags"
oArgs3(0).Value = "SDFNT"
oArgs3(1).Name = "FormulaCommand"
oArgs3(1).Value = 0
oArgs3(2).Name = "SkipEmptyCells"
oArgs3(2).Value = false
oArgs3(3).Name = "Transpose"
oArgs3(3).Value = false
oArgs3(4).Name = "AsLink"
oArgs3(4).Value = false
oArgs3(5).Name = "MoveMode"
oArgs3(5).Value = 4
dispatcher.executeDispatch(oFrame, ".uno:InsertContents", "", 0, oArgs3())
'
msgbox "Success"
End Sub
【 解説 】
本コードは現在の選択範囲をC1セルに形式を選択してコピー&貼付けるものです。
コード自体はマクロの記録の dispatcher を使ったものです。
形式は
oArgs3(0).Value = "SDFNT"
で選択して指定します。
つまり、上記コードはテキスト、日付、式、コメント、書式 を
コピーして貼付けるものです。
動画の各セルは
A1 に テキスト : String
A2 に 値 : 10
A3 に 日付 : 2023/6/7
A4 に 式 : =1+2
A5 に テキストとコメント : コメント
A6 に テキストと色付きセル : Format
が入力されてます。
(動画はクリックすると拡大します)
動画はマクロを5回実行したものを編集しています。
動画の1回目は SDFNT を指定して、A1~6のテキスト、日付、式、コメント、書式を、C1~6に貼付けています。
従い、A2は値なので、C2には何もコピーされません。
動画の2回目は S を指定して、テキストのみA1~6と同じ内容を、C1~6に貼付けます。
従って、A1,A5,A6にはテキストがあるので、C1,C5,C6に値がコピーされますが、A2~4はテキストでないので、C2~C4には値がありません。
動画の3回目は DT を指定して、日付と書式のみがA1~6と同じ内容を、C1~6に貼付け、C3とC6のセル背景色だけを貼付けます。
もし、 D のみにすると、書式がコピーされないので、C3の値は45084になり、C6は何も貼付けられません。
動画の4回目は F を指定して、式のみA1~6と同じ内容を、C1~6に貼付けます。
結果、C4にだけ、式(=1+2)がコピーされます。
動画の5回目は N を指定して、コメントのみがA1~6と同じ内容を、C1~6に貼付けます。
結果、C5のコメントだけがコピーされています。
[ Flag Value ]
S : String ( テキスト )
V : Value ( 値 )
D : Date ( 日付 )
F : Formula ( 式 )
N : Note ( コメント )
T : Format ( 書式 )
空白 : Object ( オブジェクト )
A : 全て
Sub SampleCode()
Dim oDoc as Object, oDoc2 as Object
Dim oSheet as Object, oSheet2 as Object
Dim oCell as Object, oCell2 as Object
Dim oCopyRange as Object, oPasteRange as Object
Dim oCopyData as Object
'元のDocumentの設定
oDoc = ThisComponent
oSheet = oDoc.getSheets().getByName("Sheet1")
'
'コピー先Documentの設定
oDoc2 = oWorkBook("GetComponent.ods")
IF IsNull(oDoc2) Then
msgbox "Copy先のDocumentは開かれていません"
Exit Sub
End IF
oSheet2 = oDoc2.getSheets().getByName("Sheet1")
'
oCopyRange = oSheet.getCellRangeByName("A2:A4")
oPasteRange = oSheet2.getCellRangeByName("A2:A4")
'元のDocumentからコピー先に値をコピー
oCopyData = oCopyRange.getDataArray()
oPasteRange.setDataArray(oCopyData) ' ※:式は値でコピーされる
'
'式をコピーする場合
oSheet2.getCellRangeByName("A5").Formula = oSheet.getCellRangeByName("A4").Formula
msgbox "Success", 0, "LO7.0.4.2"
End Sub
Function oWorkBook(filename As string) As Object
Dim oComponents as Object, oEnum as Object
Dim oComponent as Object
oComponents = StarDesktop.getComponents
oEnum = oComponents.createEnumeration()
While oEnum.hasMoreElements()
oComponent = oEnum.nextElement()
IF oComponent.haslocation then
IF Dir(oComponent.location) = fileName Then
oWorkBook = oComponent
Exit Function
End IF
End IF
Wend
oWorkBook = Nothing
End Function
Sub SampleCode()
GlobalScope.BasicLibraries.LoadLibrary("ScriptForge")
Dim oSF as Object
Dim oDoc As Object, oDoc2 As Object
Set oDoc = CreateScriptService("Calc", ThisComponent)
Set oSF = CreateScriptService("UI")
Set oDoc2 = oSF.CreateDocument("Calc")
oDoc2.CopyToRange(oDoc.Range("Sheet1.A2:A4"), "A1:A3")
msgbox("Success,0,LO7.5.2.2")
End Sub
Sub SampleCode()
Dim oSHeet
Dim oRangeAddress
Dim oCellAddress
oSheet = ThisComponent.Sheets(0)
oRangeAddress = oSheet.getCellRangeByName("A1:B5").getRangeAddress()
oCellAddress = oSheet.getCellByPosition(2,0).getCellAddress()
oSheet.moveRange(oCellAddress, oRangeAddress)
msgbox "Success",0,"LO7.5.2.2"
End SUb
Sub SampleCode()
GlobalScope.BasicLibraries.LoadLibrary("ScriptForge")
Dim oDoc as Object
Set oDoc = CreateScriptService("Calc", ThisComponent)
oDoc.MoveRange("Sheet1.A1:A4", "Sheet1.C1")
msgbox "Success" & Chr(13) & "(ScriptForge)",0,"LO7.5.2.2"
End SUb
Sub SampleCode()
Dim oDoc as Object
Dim oSheet1 as Object, oSheet2 as Object
Dim oCopyRange as Object
Dim oVisibleCellObj as Object
Dim oEndRow as Long, oEndCol as Long
Dim oVibleRow as Long, oVibleCol as Long
oDoc = ThisComponent
oSheet1 = oDoc.getSheets().getByIndex(0)
oSheet2 = oDoc.getSheets().getByIndex(1)
oEndRow = 20 '最終行
oEndCol = 10 '最終列
oCopyRange = oSheet1.getCellRangeByPosition(0, 0, oEndCol, oEndRow)
' VisibleCell Object取得
oVisibleCellObj = oCopyRange.queryVisibleCells()
' Visible Cell の行数を数える
oVibleRow = 0
for i = 0 to oEndRow
if oSheet1.Rows(i).isVisible = True then
oVibleRow = oVibleRow + 1
end if
next i
' Visible Cell の列数を数える
oVibleCol = 0
for i = 0 to oEndCol
if oSheet1.Columns(i).isVisible = True then
oVibleCol = oVibleCol + 1
end if
next i
' データ貼付け範囲の設定
oPasteRange = oSheet2.getCellRangeByPosition(0, 0, oVibleCol-1, oVibleRow-1)
' 表示セルの値取得
oCopyData = oVisibleCellObj.getData()
' 貼付け
oPasteRange.setData(oCopyData)
oDisp = "Success"
msgbox "Success",0,"LO7.5.2.5(Win10)"
End SUb
左の図(コピー元:Sheet1)と右の図(コピー先:Sheet2)を比較すると、行番号が違うことが分かります。
コピー元は、いくつかの行と列を非表示にしています。
行番号や列番号が途切れています(黄色線の部分が非表示部)
コピー先では非表示部がないことから、表示部のみコピーしたことが分かります。