* EXCELマクロが、オープンオフィスで動かない? [#id8b2aeb]
 |RIGHT:|LEFT:|c
 |~ページ|[[OpenOffice.org FAQの登録ページ]]|
 |~投稿者|TAKA6855|
 |~分類|#listbox3(Q&A,faq03,class)|
 |~優先順位|#listbox3(重要,faq03,priority)|
 |~状態|#listbox3(完了,faq03,state)|
 |~カテゴリー|#listbox3(Calc 表計算,faq03,category)|
 |~投稿日|2009-10-09 22:14:47 (金)|
 |~OS|XP|
 |~依存するページ||
 |~バージョン|#listbox3(3.0.1,faq03,version)|
 
 //////////バグ対策(以降マッチさせない)
 
 ** メッセージ [#m5c39bec]
 |LEFT:|c
 |回答ページでは行末に「~」を付加する必要はありません|
 EXCEL2003で作成したマクロをオープンオフィスで動かしたい教えて下さい。EXCELファイルを添付ファイルで添えて置きます宜しくお願い致します。
 
 ----
 ***faq/5/100の続き [#ue2b6021]
 >M.Kamataki (2009-10-09 23:17:07 (金))~
 ~
 faq/5/100「EXCEL2003VBA、オープンオフィス3.1で使えるようにしたい」で指摘したことは実践されましたか。~
 ~
 まず、「ExcelファイルをCalcで読み込んで実行する方法」を紹介しています。該当のWebの記事を読まれていれば、添付ファイルのマクロのうち、「削除_Click」「印刷_Click」「列幅拡大_Click」「列幅縮小_Click」を実行できるはずです。~
 ~
 マクロの実行ですが、メニューの「ツール」−「マクロ」−「マクロの管理」−「OpenOffice.org Basic」を選んで「OpenOffice.org Basic マクロ」ダイアログを表示します。出荷.xlsのStandardライブラリのSheet1を選ぶと「マクロのある場所」にマクロの一覧が表示されます。とりあえず、「印刷_Click」あたりのマクロが実行可能なことが確認できると思います。(仮想PDFプリンタなどがあるとテストしやすいです)~
 ~
 さて、問題はシート上のボタンのイベントの割り当てが解除されることです。これは、現在のところ仕様だと思われます。たとえば、「ファイルを開く」イベントにPCに重大な悪影響を与えるマクロの実行が含まれていると困りますよね。たぶんExcelのマクロウイルス対策だと思います。~
 ~
 ボタンのイベントをCalc上で割り当てなおせば、上記のCalcで動作可能なマクロは動きます。別名のxlsファイルとして保存したところ、次回ボタンのイベントでマクロを実行できました。~
 ~
 ただし、faq/5/100でtaniさんが書かれているように、今後Calcだけを利用されるのなら、VBAをOpenOffice.org Basicへ移植されたほうが良いかもしれません。~
 ~
 あるいは今後もExcelとの併用が考えられ、xls形式のファイルが使われていくのであれば、Excel、Calcの両方で動作するVBAだけを利用することを考えていく必要も出てくるでしょう。~
 
 //
 ***M.Kamataki さんご教授有難うございます。 [#uad4a1db]
 >TAKA6855 (2009-10-10 04:59:45 (土))~
 ~
 前回、ご教授頂いた、マクロ(削除印刷列幅大、小)は動作確認が出来ましたが、添付ファイル(出荷依頼シートB10:B39)に入力したデータに関しては動作しません、(製品リストB列、下4桁の品番を入力した場合、それに該当するデータを表示させるようにしています,頭にZが入った場合はZAの付く品番を持って来るようにしています。)以下にEXCELコードを記載して置きます宜しくお願い致します。~
  Private Sub Worksheet_Change(ByVal Target As Range)
    Dim WS2 As Worksheet
    Dim v As Variant
    Dim lngRow As Long
    Dim m As Variant
   
    If Target.Count > 1 Then Exit Sub
    If Intersect(Target, Range("B10:B39")) Is Nothing Then Exit Sub
   
    Set WS2 = Worksheets("製品リスト")
   
    v = WS2.Range("A1").CurrentRegion
    For lngRow = 2 To UBound(v, 1)
      If v(lngRow, 2) Like "ZA*" Then
        v(lngRow, 1) = "Z" & Right(v(lngRow, 2), 5)
      Else
        v(lngRow, 1) = Right(v(lngRow, 2), 5)
      End If
    Next
    m = Application.Match(CStr(Target.Value), Application.WorksheetFunction.Index(v, 0, 1), 0)
  
    If IsNumeric(m) Then
      Target.Offset(, 1).Resize(, 4).Value = Array(v(m, 2), v(m, 3), v(m, 4), v(m, 5))
    Else
      If Target.Value <> "" Then
        MsgBox "品番 [" & Target.Value & "] は存在しません"
      Else
        Target.Offset(, 1).Resize(, 4).ClearContents
      End If
    End If
  End Sub
 
 //
 ***ファイルの運用ルールは? [#s44c1427]
 >M.Kamataki (2009-10-10 07:09:54 (土))~
 ~
 まず、ファイルの運用ルールがあると思います。つまり最初の回答の最後に触れた点です。今後、Calcに完全移行するなら、OpenOffice.org Basicに書き換えたほうが良いと思いますし、Excel上でマクロを実行する可能性も残るのなら、Excel、Calcで動作可能なVBAマクロで記述し直さないといけませんよね。~
 ~
 「Excel、Calcで動作可能なVBAマクロ」というのが、今回のファイルの目的に対して実現可能かどうかまだ未検証ですが、このファイルの運用ルールは決まっていますでしょうか。~
 
 //
 ***M.Kamatakiさん、ご質問の件 [#i07efaf7]
 >TAKA6855 (2009-10-10 11:08:31 (土))~
 ~
 今後は、すべてオープンオフィスでの運用を考えています。すでに仕事場のPCには、オープンオフィスが入っていますので、EXCELでの運用は考えていません、またご指摘の削除、列幅小、大、入力に関しては問題なく使えるようです。但し出荷依頼シートB10:B39に入力した案件に関しては動作不能状態です、宜しくお願い致します。~
 
 //
 ***Calcで動作しないもの [#ccc7db23]
 >M.Kamataki (2009-10-10 22:28:44 (土))~
 ~
 faq/5/100で紹介したはにゃ?さんのサイトはご覧になりましたか。「入力_Click」で使われている「Application.MoveAfterReturnDirection = xlToRight」の記述、「Worksheet_Change」のセルの変更をマクロで検出する部分はともにCalcではリスナーの登録というひと手間が必要なので、Excelのマクロは動作しないのです。~
 ~
 「Application.MoveAfterReturnDirection = xlToRight」は単にEnterキーを押下した際、セルが右へ移動するよう変更するものですよね。これはオプションの設定でも変更が可能なので、「入力_Click」は「Application.MoveAfterReturnDirection = xlToRight」を削除するだけで期待する動作になりますよね。~
 ~
 「Worksheet_Change」のほうは、Calcで動作するようOpenOffice.org Basicで完全に書き換えるしかないです。faq/5/100で紹介したサイトより、たぶん、以下のはにゃ?さんのサイトが参考になると思います。~
 ~
 セルの値が変化したときにマクロを起動させたい。~
 http://hermione.s41.xrea.com/pukiwiki/pukiwiki.php?OOobbs2%2F84~
 ~
 また、以下のOpenOffice.org コミュニティフォーラムでもかなり近い処理のExcelマクロからCalcへの書き換え例が紹介されています。~
 ~
 Using a list box to output multiple selections~
 http://user.services.openoffice.org/en/forum/viewtopic.php?f=20&t=15572~
 
 //
 ***マクロ以外の実現方法 [#m43dfde1]
 >M.Kamataki (2009-10-11 00:32:45 (日))~
 ~
 「選択品番」列をB10からB39セルまでを選択し、「データ」−「入力規則」の設定で「条件」タブの「入力値の種類」を「セルの範囲」にし、「ソース」欄を「$製品リスト.$B$2:$B$9」と設定するとリストからの入力が可能になります。~
 ~
 加えて「品番」欄はC10セルに「=B10」と入力して、C10セルをコピーし、C11からC39セルへ貼り付けます。また、「略式」欄はD10セルに「=IF(ISBLANK(B10);"";VLOOKUP(B10;$製品リスト.$B$1:$D$9;2;0))」と入力して、D10セルをコピーし、D11からD39セルに貼り付けます。「型式」欄も同様に設定すると、ほぼ「Worksheet_Change」マクロで実現していることと同等の結果を得られます。こんな方法も検討されてはいかがでしょうか。~
 ~
 参考:~
 CalcでVLOOKUP練習~
 http://dbweb.0258.net/wiki.cgi?page=Calc%A4%C7VLOOKUP%CE%FD%BD%AC~
 
 //
 ***どうしてもマクロでの場合 [#p8bff12d]
 >ike@九州 (2009-10-11 14:54:22 (日))~
 ~
 今後セルの変更イベントをマクロで実行したい需要(動作が軽くなる、読み込み時間の短縮等)があるかもしれないので、添付していただいたサンプルを元にCalcドキュメントで作成しました。~
 ~
 セル変更イベントリスナーの登録解除は Tsunoda さんのファンクションをまんま利用させていただきました。~
 http://blog.livedoor.jp/addinbox/archives/51276233.html~
 ~
 変更点 "Option VBASupport 1" で動作しない部分~
 ~
 -ファイルを開くイベントにリスナー登録~
 -ファイルを閉じるイベントにリスナー解除~
 -入力ボタンクリックで製品リストを配列読み込み~
 -Enterキー後の移動方向の変更用マクロ加筆~
 ~
 結構 "Option VBASupport 1" で動作するんですね~
 
 //
 ***注意事項追加 [#ec0178a0]
 >K.Tsunoda (2009-10-11 16:24:00 (日))~
 ~
 > http://blog.livedoor.jp/addinbox/archives/51276233.html~
 注意事項が増えましたので読んでおいてください。~
 ~
 Calc の Modify リスナーでは、どう頑張っても【 Excel並みの安定 】した~
 セルのChange イベントは構築できそうもありません(泣)~
 ~
 今まで実務利用のマクロを構築して来られた皆さんは、どのように~
 対処されているのでしょう。ちょっと不思議な気がします。~
 (セルのChangeイベントを使わない方向で対処されているのかな?)~
 何かこれはというアイデアがあったら、私も教えて欲しいです。~
 ~
 ~
 あと、こちらのサンプルマクロは監視セルの上で行挿入すると~
 実行時エラーになりますよ。~
 > Using a list box to output multiple selections~
 > http://user.services.openoffice.org/en/forum/viewtopic.php?f=20&t=15572~
 挿入後の新たなセル位置で Modify イベントが起こるので、oEv.Source は~
 C3セルとなり、"$Sheet1.$C$3"のキーでコレクションにアクセスしますが、~
 コレクションへは "$Sheet1.$C$2" のキーで登録してある為に失敗します。~
 ~
 この点を理解した上でエラーにならないような改良を施しつつ利用する~
 必要があります。~
 
 //
 ***有難うございます。 [#h47ff66c]
 >TAKA6855 (2009-10-11 16:41:58 (日))~
 ~
 下記添付ファイル(出荷.ods)で思い通りの物が出来ました。皆さんに感謝申し上げます。添付のマクロは因みに、バージョンの古いオープンオフィスでも動作可能でしょうか?~
 
 //
 ***シートの保護活用 [#a9b3c963]
 >ike@九州 (2009-10-12 08:47:04 (月))~
 ~
 業務で使用する場合、リスナー登録するシートの保護を行っていれば行、列、セルの挿入、削除は防げます。~
 勿論、入力するセルの保護は解除していないといけませんが、それ以外のセルが保護されていれば挿入、削除は出来ません。検討して下さいね~
 ~
 以下の点、要修正~
 各ボタンのプロパティから~
 "クリック時にフォーカス"を"いいえ"に変更して下さい。~
 ~
 動作については~
 3.01、3.1.1で確認、~
 それ以前は Excel VBAサポートの内容次第だと思います。~
 全て、OOo Basic用に書き直せば 2.x でも OK かと…~
 
 //
 ***Thanks♪ [#zc6d6fca]
 >K.Tsunoda (2009-10-12 11:51:44 (月))~
 ~
 ike@九州さん、ありがとうございます。~
 確認しました。~
 右クリックでのセル単位を含め挿入/削除を抑止できますね。~
 ブログに書き加えておきました。~
 
 //
 ***エラー処理 [#oeb17088]
 >M.Kamataki (2009-10-12 12:17:57 (月))~
 ~
 サンプルの 出荷.ods すばらしいです。なお、「入力」ボタンをクリックしないで、B10セルなどに入力しようとするとエラーになります。実運用時は、デバッグ画面(IDEの表示)は避けたいでしょうから、AnyModify_modifiedのルーチンに以下のようなエラー処理を入れたほうが良いと思いました。~
  'ルーチンの前のほうで適切な位置に
  On Error GoTo ErrorHandler
  'End Subの前に
  Exit Sub
  ErrorHandler:
  MsgBox "入力ボタンが実行されていません。"
 TAKA6855さんもご存知かもしれませんが、「On Error GoTo」はExcelのマクロと同じ使い方ができます。~
 ~
 ファイル読み込み速度との兼ね合い(faq/5/81)もありますが、関数で入力セルの変化を検知するという方法は、ExcelとCalcが共存状態で、どちらでも同じExcelのマクロ入りファイルを共有したいときなどに有効だと思いました。~
 
 //
 #article