Cell操作
[ Copy・Move(1)]
書式を含めてコピー(CopyRange)
Sub oCopyRange()
Dim oSHeet
Dim oRangeAddress
Dim oCellAddress
oDoc = ThisComponent
oSheet = oDoc.Sheets(0)
oRangeAddress = oSheet.getCellRangeByName("A1:B5").getRangeAddress()
oCellAddress = oSheet.getCellByPosition(2,0).getCellAddress()
oSheet.copyRange(oCellAddress, oRangeAddress)
msgbox("Success",0,"LO7.5.2.2")
End SUb
書式を含めてコピーされます。
動画でコピー先のC1~D5は値と共にセルの背景も代わっていることが分かります。
ScriptForgeを利用
Sub SampleCode()
GlobalScope.BasicLibraries.LoadLibrary("ScriptForge")
Dim oDoc As Object
Set oDoc = CreateScriptService("Calc", ThisComponent)
oDoc.CopyToCell(oDoc.Range("Sheet1.A1:A4"), "Sheet1.C1")
msgbox("Success,0,LO7.5.2.2")
End Sub
ScriptForgeを利用して、書式を含めてコピーするコードです。
動画でコピー先に値と共にセルの書式もコピーされていることが分かります。
ScriptForge は LO7.2から実装された機能なので、古いLOでは動きません。
値のみコピー(配列利用:getDataArray/setDataArray)
Sub CopySumple()
Dim oDoc as Object
Dim oSheet1, oSheet2 as Object
Dim oCopyData as Object
Dim oCopyRange as Object
Dim oPasteRange as Object
Dim sCol, eCol as Long
Dim sRow, eRow as Long
oDoc = ThisComponent
oSheet1 = oDoc.getSheets().getByIndex(0)
oSheet2 = oDoc.getSheets().getByIndex(1)
sCol = 0: eCol = 4:sRow = 0: eRow = 10
oCopyRange = oSheet1.getCellRangeByPosition(sCol, sRow, eCol, eRow)
oPasteRange = oSheet2.getCellRangeByPosition(sCol, sRow, eCol, eRow)
oCopyData = oCopyRange.getDataArray()
oPasteRange.setDataArray(oCopyData)
msgbox("Success",0,"LO7.5.2.2")
End Sub
【解説】
Excel VBAも同じですが、書式の設定には時間が掛かります。
「なら、書式を選択して貼付ければ良い」という考えもありますが、マクロの記録は遅いので検討対象になりません。
そこで、値を配列に格納することで高速化しています。
また、配列に格納するので、取得したデータを個別に取得し、加工して貼りつけることも可能になります。
例えば、元値から条件にあったデータだけを貼付けることも可能となります。
Sub SampleCode
Dim oDoc as Object
Dim oSheet as Object
Dim oCopyData as Object
Dim oCopyRange as Object
Dim oPasteRange as Object
Dim sCol, eCol as Long
Dim sRow, eRow as Long
oDoc = ThisComponent
oSheet = oDoc.getSheets().getByIndex(0)
sCol_1 = 0:eCol_1 = 0:sRow_1 = 0:eRow_1 = 4
sCol_2 = 2:eCol_2 = 2:sRow_2 = 0:eRow_2 = 4
oCopyRange = oSheet.getCellRangeByPosition(sCol_1, sRow_1, eCol_1, eRow_1)
oPasteRange = oSheet.getCellRangeByPosition(sCol_2, sRow_2, eCol_2, eRow_2)
oCopyData = oCopyRange.getData()
oPasteRange.setData(oCopyData)
msgbox("Success",0,"LO7.5.2.2")
End Sub
【解説】
getData、setDataで値のみをCopyしています。
取得できるのは、値(Value)だけですので、
(A)テキストは取得されない(Copyされない) ← getDataArray, setDataArrayとの違い
(B)式は値に変換される
(C)Cellの書式やCommentは取得されない。
ことに注意しましょう。
getDataArray, setDataArrayとの違いは、テキストも取得してCopyできるかどうかです。(※)
また、getDataArrayは配列として取得されるので、値の加工が容易です。
※ 昔のversionでは getDataでも テキストは取得されたかも?
LO7.5.2.2 win10(64bit)では上記動画のように取得できていませんので、素直に 配列を使う方が良いと思います。