「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:1
昨日:0
総数:1912
現在:2


数字を使ってアルファベットを表すには

ページOpenOffice.org FAQの登録ページ
投稿者mr_happy
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2011-05-18 13:47:30 (水)
OSWin7
依存するページfaq/6/221
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

お世話になります。

数字を使ってアルファベットを表すにはどすれば出来ますか? セルアドレスの取得に使いたいのです。 getRangeAddress から StartColumn などは分かりますが
これを例えば "C2:E5" で表現する方法が直接にはなさそうなので、その手段として使用したいわけです。
この具体的なイメージ例は

MsgBox "A"+1   ' Bを表現
MsgBox "A"+2     ' Cを表現

の様な方法です。


回答

M.Kamataki (2011-05-18 16:05:51 (水))

MsgBox CHR(ASC("A")+1)   ' Bを表現
MsgBox CHR(ASC("A")+2)     ' Cを表現

セルの取得方法

M.Kamataki (2011-05-18 16:08:23 (水))

>"C2:E5" で表現する方法が直接にはなさそう

どういう意味でしょうか。getCellRangeByName はお存じない? 以下参照。

http://hermione.s41.xrea.com/pukiwiki/pukiwiki.php?OOoBasic%2FCalc%2Fcell

あるいは以下でしょうか。

http://hermione.s41.xrea.com/pukiwiki/pukiwiki.php?OOoBasic%2FCalc%2Faddress

AbsoluteName

Wannwanno (2011-05-18 23:12:17 (水))

これのことでは?

oCellRange = ThisComponent.Sheets.getCellRangeByPosition(0, 0, 1, 1, 0)
Msgbox oCellRange.AbsoluteName

セルアドレスの取得方法です

mr_happy (2011-05-19 08:42:30 (木))

M.Kamataki さん、Wannwanno さんありがとうございます。

「セルの取得」ではなく、~
getCellRangeByPosition 後の"C2:E5"スタイルでの「セルアドレスの取得」です。~
イメージ例は

oCellRange = ThisComponent.Sheets.getCellRangeByPosition(0, 0, 1, 1, 0)
oAdr = oCellRange.▽▽▽

すると oAdr には "A1:B2" が入っている。の様にです。~

AbsoluteName は 「Shee5.A1:B2」 のようになるため、Shee5. が余分です。
省くことはできるのでしょうか?

とりあえずは CHR(ASC("A")+1) が使えればOKです。これから試してみますが、~
上記イメージ例が出来ればもっと良さそうです。

無題

ike@九州 (2011-05-19 09:00:00 (木))

Kamataki さん照会先をよく読まれましたか?
3.2付近から利用できるサービス
http://hermione.s41.xrea.com/pukiwiki/pukiwiki.php?OOoBasic%2FCalc%2Faddress#na4b434d

Sub CellRangeAddressConversion
 oRangeAddrConv = ThisComponent.createInstance("com.sun.star.table.CellRangeAddressConversion")
 oCellRange = ThisComponent.Sheets.getCellRangeByPosition(0, 0, 1, 1, 0)
 oRangeAddrConv.Address = oCellRange.RangeAddress
 'Sheet1.A1:Sheet1.B2 と表示
 msgbox oRangeAddrConv.PersistentRepresentation
 'A1:B2 と表示
 msgbox oRangeAddrConv.UserInterfaceRepresentation
End Sub

無題

K.Tsunoda (2011-05-19 11:35:40 (木))

> AbsoluteName は 「Shee5.A1:B2」 のようになるため、Shee5. が余分です。
> 省くことはできるのでしょうか?
Split/Join を使ってできます。

Dim oActiveSheet As Object
Dim oCell As Object
Dim strCellAddr As String
Dim vntSheetCell As Variant
 
 oActiveSheet = ThisComponent.CurrentController.ActiveSheet
 oCell = oActiveSheet.getCellRangeByName( "B2:D5" )
 
 strCellAddr = oCell.AbsoluteName
 MsgBox strCellAddr     'e.g. "$Sheet1.$B$2:$D$5"
 
 'Replace(strCellAddr, "$", "") は NG、Replaceはバグ有
 strCellAddr = Join(Split(strCellAddr, "$"), "")
 MsgBox strCellAddr     'e.g. "Sheet1.B2:D5
 
 vntSheetCell = Split(strCellAddr, ".")
 MsgBox "SheetName= " & vntSheetCell(0) & chr(13) & _
        "CellAddr= " & vntSheetCell(1)


http://blog.livedoor.jp/addinbox/archives/51223812.html

シート名に"."が含まれる場合

はにゃ? (2011-05-19 18:46:18 (木))

Split で分割するとシート名に "." が含まれる場合に変になりますねぇ。

ピリオド含みシート名

K.Tsunoda (2011-05-19 23:04:20 (木))

シート名にピリオドって記述できるんですね(驚)
Excelで試したら ! が指定できた(驚×2)

まぁ、そんなの無いとは思うけど、
ピリオドSheet名もカバーするコード。

Sub Main
Dim oSheet As Object
Dim oCell As Object
Dim strCellAddr As String
Dim vntSheetCell As Variant
Dim strCell As String
Dim strSheet As String
Dim i As Integer
 
 oSheet = ThisComponent.getSheets.getByName ("Sheet1")
 'oSheet = ThisComponent.getSheets.getByName ("Sheet2.AB")  'ピリオド含みSheet名
 
 oCell = oSheet.getCellRangeByName( "B2:D5" )
 
 strCellAddr = oCell.AbsoluteName
 MsgBox strCellAddr     'e.g. "$Sheet1.$B$2:$D$5"
 
 'Replace(strCellAddr, "$", "") は NG、Replaceはバグ有
 strCellAddr = Join(Split(strCellAddr, "$"), "")
 MsgBox strCellAddr     'e.g. "Sheet1.B2:D5
 
 vntSheetCell = Split(strCellAddr, ".")
 If (UBound(vntSheetCell) = 1) Then
   strSheet = vntSheetCell(0)
   strCell = vntSheetCell(1)
 Else
   'Sheet名にピリオドが含まれている場合( e.g. "'Sheet2.AB'.B2:D5" )
   i = UBound(vntSheetCell)
   strCell = vntSheetCell(i)
   ReDim Preserve vntSheetCell(i-1)
   strSheet = Join(vntSheetCell,".")
   strSheet = Join(Split(strSheet, "'"), "")
 End If
 MsgBox "SheetName= " & strSheet & chr(13) & _
        "CellAddr= " & strCell
End Sub



なお、Sheet名は下記でも取得できるので
oSheet.Name or oCell.Spreadsheet.Name

oCell = oSheet.getCellRangeByName( "B2:D5" )
strCellAddr = oCell.AbsoluteName
strCellAddr = Join(Split(strCellAddr, "$"), "")
vntSheetCell = Split(strCellAddr, ".")
 
strSheet = oCell.Spreadsheet.Name
strCell = vntSheetCell(UBound(vntSheetCell))

とすれば、Sheet名のピリオド有無に関係なく対応化。

シート名に ' が含まれる場合

はにゃ? (2011-05-19 23:47:18 (木))

一緒に書けばよかったのですが、シート名の最初と最後以外には ' を含めることができます。シングルクォートが入っている場合には二つ '' としてエスケープされます・・・。

皆さんありがとう。

mr_happy (2011-05-20 10:18:26 (金))

皆さんありがとうございます。
ike@九州 さんが Kamataki さんの照会先を分かりやすくしていただき理解できました。紹介先には getCellRangeByPosition の様な部分がなく、何となく違う分野ではと思い、テストせずにやり過ごしてしまいました。

紹介方法でテストをしました。

私の場合、セルデータを配列に入れ計算後に別な頁に結果を貼り付けます。~
貼り付けるセルは最初の1コのみ指定し、後はデータをOOo用の配列に入れたものを貼り付けます。~
なので新セルアドレスは getCellRangeByPosition(0, 0, 1, 1) 形式でも良いのですが、getCellRangeByName("A1:B2") の形式も作ってみたかったわけです。~
上記のことをするとき、紹介されたマクロとどちらが簡単か、となりました。~
下記はそのマクロですが、如何なものでしょうか? まぁ、速度は大差ないとは思いますが将来的なスタイル等も含めて。

Sub TstXX
   Dim oWSheet, oOneRng, oWRange
   Dim sNewAdr, vMyBuf
   ' vMyBuf 中にOOoに合った配列データを得る
   Call f_SetMyData(vMyBuF)  ' この部分は仮のマクロ
   
   oWSheet = ThisComponent.Sheets(5)
   oOneRng = oWSheet.getCellRangeByName("B8") 
   ' B8 を起点とした、vMyBufのデータ書込みセル範囲を取得 
   sNewAdr = f_GetABCAdr(oOneRng, vMyBuf)                                
   oWRange = oWSheet.getCellRangeByName(sNewAdr)                       
   oWRange.setFormulaArray(vMyBuf)                                     
End Sub
'=======1コのセルアドレスとバッファの配列から新しいセルアドレスを得る A1 型 ==============
Function f_GetABCAdr(oOneRng, vMyBUF) As String
   Dim sNewAdr As String, x1 As Integer, x2 As Integer, y1 As Integer, y2 As Integer
   
   Call f_GetXYAdr(oOneRng, vMyBUF, x1, y1, x2, y2)
   sNewAdr = CHR(ASC("A")+x1) & y1 & ":" & CHR(ASC("A")+x2) & y2
   f_GetABCAdr = sNewAdr
End Function    
'=======1コのセルアドレスとバッファの配列から新しいセルアドレスを得る 0,0 型 =============
Sub f_GetXYAdr(oOneRng, vMyBUF, x1, y1, x2, y2)
   Dim oOneAdr
   
   oOneAdr = oOneRng.getRangeAddress()
   x1 = oOneAdr.StartColumn  
   y1 = oOneAdr.StartRow + 1      ' GetXYAdr単独使用時は y1 = oOneAdr.StartRow
   x2 = Ubound(vMyBUF(0)) + x1
   y2 = Ubound(vMyBUF)    + y1  
End Sub

K.Tsunoda さんの書いたピリオド付のは更に研究します。

オブジェクト

Wannwanno (2011-05-21 18:29:42 (土))

アドレス(範囲名又は範囲座標)よりもオブジェクトを返した方が使い易いのでは?

Sub TstXX
  Dim oOneRng As Object
  Dim vMyBuf As Variant
  
  oOneRng = ThisComponent.Sheets(2).getCellRangeByName("C8")
  vMyBuF = f_GetMyData
  f_GetCellRangeByArray(oOneRng, vMyBuf).setFormulaArray(vMyBuf)
End Sub

Function f_GetMyData As Variant
  f_GetMyData = array(array("A", "B", "C"), array("D", "E", "F"))
End Function

Function f_GetCellRangeByArray(oOneRng As Object, vMyBUF As Variant) As Object
  Dim oOneAdr As Object
  Dim x1 As Integer, y1 As Integer, x2 As Integer, y2 As Integer
  
  oOneAdr = oOneRng.getRangeAddress
  x1 = oOneAdr.StartColumn
  y1 = oOneAdr.StartRow
  x2 = Ubound(vMyBUF(0)) + x1
  y2 = Ubound(vMyBUF)    + y1
  f_GetCellRangeByArray = oOneRng.Spreadsheet.getCellRangeByPosition(x1, y1, x2, y2)
End Function

そうですね、こちらが簡単ですね

mr_happy (2011-05-22 20:36:12 (日))

Wannwanno さん ありがとうございます。
A1形式にこだわる必要はないので(一度は実現しておきたかった)、こちらが簡単ですね。

f_GetCellRangeByArray(oOneRng, vMyBuf).setFormulaArray(vMyBuf)

の様な使い方もできるのも新発見でした。~

Function f_GetMyData As Variant
 f_GetMyData = array(array("A", "B", "C"), array("D", "E", "F"))
End Function

の設定では~
x2 = Ubound(vMyBUF(0)) + x1 のところでエラーとなりました。(OOo形式の配列になっていないのかも)~
私は faq/6/221 の Function f_DrctIn(vXBuf, xMx) As Variant 形で解消しています。

UBound

Wannwanno (2011-05-24 22:19:34 (火))

UBound関数でエラーになるのは解せないです
バージョン3.3.2のバグ?
エラーメッセージは何と表示されましたか?

大丈夫でした!

mr_happy (2011-05-25 09:01:18 (水))

Wannwanno さん、もう一度コピペしてやってみたところ
こんどはすんなりだいじょうぶでした。~
最初も同じようにしたのですが、原因不明です。すいませんでした。
ありがとうございます。

お名前:
題名: