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

Q&A集[?]

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

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

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

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:3
昨日:1
総数:2242
現在:3


他Bookのセル読み込み これは何なんでしょう!?

ページOpenOffice.org FAQの登録ページ
投稿者Mr_Happy
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2011-03-21 11:06:10 (月)
OSWin7
依存するページfaq/6/188
バージョン
edit/refer

メッセージ

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

お世話になります。 小生なんとかして簡単に他のCalcブックのセルを読み込めないかと苦戦中。 先日、エクセルのVBAをIDEに移植できないか、とやっているうちに 下記のように書くとうまく動作したのです!! ところが、そうこうするうちにエラーとなりできなくなります。 もう一度立ち上げなおしたとき、動作するときもあるのです! 原因が全くつかめません。 たぶんもともと無理な構文なのでしょうが、 「うまくゆくときがある」 ということに未練があり、皆さんのアドバイス等ご意見を聞かせていただきたいと思います。

下記はその時のマクロで、二つは同じものです。

Sub MacroX1()
 Dim aa as String 
 aa = Workbooks("絵本.xlsx").Sheets(1).Range("D7")
 ThisComponent.Sheets(0).getCellByPosition(5,3).String=aa  
End Sub
Sub MacroX2()
 Dim aa as String
 Workbooks("絵本.xlsx").Activate   ' 左記二行がエクセル流の書式で、他のファイルを読み込む
 aa = Sheets(1).Range("D7")       ' 最初のシートのD7セルを代入
     
 ThisComponent.Sheets(0).getCellByPosition(5,3).String=aa   ' マクロのあるodsファイルに書き込み
End Sub

追記

Mr_Happy (2011-03-21 11:22:21 (月))

「絵本.xlsx」はエクセルではなく、LibreOfficeで開いた状態です。 もちろん他のODSファイルも同様に読み込みを目指します

追記の追記

Mr_Happy (2011-03-21 16:42:03 (月))

このマクロを書いたModule1の先頭は

REM ***** BASIC ***** ですが

Sheet1 のマクロ頁の先頭では

Rem Attribute VBA_ModuleType=VBADocumentModule
Option VBASupport 1

となってますが、関係はあるのでしょうか?

ちなみに他のodsファイルにマクロを移植すると、うまくゆくときは無いようです。

またVBA属性の設定ダイアログでは、エクセルのバージョンが
97/2000/XP でWin7が書かれていません、この辺はどうなのかな?

どなたか教えてくださーい!

VBA互換モード

ike@九州 (2011-03-22 10:12:30 (火))

Option VBASupport 1 を記述すると
OOo Basic はVBA互換モードで動作します。
VBA形式で記述されたコードをある程度通訳して動作させるという仕様です。

別のソフトウェアですので完全互換ではなくある程度の動作になります。
以下のサイトが詳しく解説されています。
http://freeopenoffice.jimdo.com/

但し、出来るならば VBA互換モードを使用する事なく別個に勉強されたほうが後々、スムーズに行くので宜しいかと…

以下は OOoBasic オンリーです
ThisComponent はアクティブなコンポーネントを取得しますので、絵本.xlsx がアクティブになっていると oDoc も絵本.xls になり正しく動作しないので書き込みたいドキュメントをクリックするなりしてアクティブにして次にマクロを実行する必要があります。
("絵本.xlsx" は既に開いているものとしています)

Sub test
 oDoc = ThisComponent 
 oDoc2 = fnGetComponentByName("絵本.xlsx")
 IF IsNull(oDoc2) Then
  Msgbox("指定されたドキュメントは開かれていません")
   Exit Sub
 End IF
 oDoc.Sheets(0).getCellByPosition(5,3).String = oDoc2.Sheets(0).getCellRangeByName("D7").String
End Sub

'開いているドキュメントの中から取得する
Function fnGetComponentByName(filename As string) As Object
  oComponents = StarDesktop.getComponents
  oEnum = oComponents.createEnumeration()
  While oEnum.hasMoreElements()
    oComponent = oEnum.nextElement()
    IF oComponent.haslocation then
       IF Dir(oComponent.location) = fileName Then
          fnGetComponentByName = oComponent
          Exit Function
       End IF
    End IF   
  Wend
  fnGetComponentByName = Nothing
End Function

ありがとうございます。完了です

Mr_Happy (2011-03-22 10:52:21 (火))

ike@九州 さんありがとうございます

VBA形式で記述されたコードをある程度通訳して動作させるという仕様です。

別のソフトウェアですので完全互換ではなくある程度の動作になります。

やはりそうですよね。出来れば OOoBasic オンリーでゆきたいわけです。
今テストしてみて、うまく書き込みできるのでさらに挑戦する気になってきました。
VBAとは勝手が違い戸惑うばかりですが、お陰様で折れずにすみました。

VBA --> OOo.Basic 移植

K.Tsunoda (2011-03-22 13:40:11 (火))

> VBAとは勝手が違い戸惑うばかりです
今までの移植作業で、ぶつかった壁&回避策です。下記参考に

「VBA vs OOo.Basic 対比表」
http://www.h3.dion.ne.jp/~sakatsu/OOo_vs_VBA.htm

「VBAユーザーの為のOpenOffice.org 備忘録」
http://blog.livedoor.jp/addinbox/

こんなのができました

Mr_Happy (2011-03-28 12:50:08 (月))

お陰様で下記のようなプログラムが出来ました。
もしもこれを見かけて手直ししたほうが良い場合は、そのアドバイスをお願いします。完了したけど、せっかく苦労したので・・・


'今使用しているCalcの0頁のC3〜F7セルに、
'開いている「絵本.xlsx」の2頁のB2〜のデータを書き込む
Sub Y_DocYomiKaki_Main
   Y_DocYomiKaki(0,"C3:F7","絵本.xlsx",2,"B2")
End Sub

Sub Y_DocYomiKaki(nMyPg, sMyRngAdr, sYuBkNa, nYuPg, sYuCellAdr)
   Dim oMyCmp As Object, oMyDoc As Object
   Dim oYuCmp As Object, oYuDoc2 As Object
   Dim oYuSht As Object, oYuDat As Object
   Dim nMxClm As Integer, nMxRow As Integer
   
   oMyCmp = ThisComponent                       
   oMyDoc = oMyCmp.Sheets(nMyPg).getCellRangeByName(sMyRngAdr) 
 ' 使用中のドギュメント
   Call Y_GetMyAdr(oMyDoc, nMxClm, nMxRow)                   
 ' 貼り付け場所の範囲を得る
          
   If Y_ChkYuCmp(oYuCmp, sYuBkNa) = FALSE Then Exit Sub    
 ' 目的のファイルがなければ終了
   oYuSht = oYuCmp.Sheets(nYuPg)               '
   oYuDoc2 = oYuSht.getCellRangeByName(sYuCellAdr)            
  ' 目的ファイルの最初のセルのあるドギュメント
   Call Y_GetYuDat(oYuSht, oYuDoc2, oYuDat, nMxClm, nMxRow)  
 ' 目的ファイルからデータを得る
   oMyDoc.setDataArray(oYuDat)                                 
 ' 使用中のファイルにデータを書き込む
End Sub

Sub Y_GetMyAdr(oMyDoc, nMxClm, nMxRow)
   Dim oMyAdr As Object
   
   oMyAdr = oMyDoc.getRangeAddress()
   nMxClm = oMyAdr.EndColumn - oMyAdr.StartColumn
   nMxRow = oMyAdr.EndRow - oMyAdr.StartRow
End Sub

Sub Y_GetYuDat(oYuSht, oYuDoc2, oYuDat, nMxClm, nMxRow)
   Dim oYuDocNew As Object, oYuAdr As Object   
  
   oYuAdr = oYuDoc2.getCellAddress()
   oYuDocNew = oYuSht.getCellRangeByPositi( _
               oYuAdr.Column,oYuAdr.Row, _
               oYuAdr.Column + nMxClm, oYuAdr.Row + nMxRow)
   oYuDat = oYuDocNew.getDataArray()
End Sub 
'sssss開いているDoc中から目的のDocを取得する  sssssssss
Function Y_ChkYuCmp(oYuCmp As Object,sFileNa As String) As Boolean
   Dim oComp As Object, oEnmr As Object
   
   oComp = StarDesktop.getComponents
   oEnmr = oComp.CreateEnumeration() 
   While oEnmr.hasMoreElements()
       oYuCmp = oEnmr.nextElement()
       IF oYuCmp.hasLocation Then                         
       ' Titleがあれば        
           IF oYuCmp.Title = sFileNa Then                 
            ' ファイル名が一致すれば    
              Y_ChkYuCmp = TRUE                     
              Exit Function
           End IF
       End IF
   Wend
   Y_ChkYuCmp = FALSE
   Msgbox(sFileNa & " は開かれていません")
End Function

何で?

Mr_Happy (2011-03-28 12:53:45 (月))

何で Sub・・・やEnd Sub の部分などが灰色の枠からはみ出るのでしょうかね・・・・
書き方がわかりません!! Helpe

Re: 何で?

M.Kamataki (2011-03-28 13:38:04 (月))

行頭に半角スペースを入れると、整形済みテキストになります。(直しておきました)

左のメニューから「当サイトの使い方」-「PukiWikiの編集方法」-「テキスト整形のルール」をご覧ください。

お名前:
題名: