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

Q&A集[?]

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

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

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

質問コーナー

サイト内検索

分類メニュー

関連サイト


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


EXCEL2003VBA、オープンオフィス3.1で使えるようにしたい

ページOpenOffice.org FAQの登録ページ
投稿者TAKA6855
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2009-10-05 21:29:49 (月)
OSxp
依存するページ
バージョン
edit/refer

メッセージ

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

初めて投稿します、EXCEL2003VBA、オープンオフィス3.1で使えるようにしたい初心者の為解りません

Private Sub 入力_Click()
 Application.MoveAfterReturnDirection = xlToRight
    Range("B10:g49").Select
   End Sub


Private Sub 削除_Click()
Range("B10:K49").Select
     Selection.ClearContents
    Range("B10").Select
End Sub

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



Private Sub 印刷_Click()
Columns("C:f").Select
    Selection.EntireColumn.Hidden = fales
 ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
   Dim WS1 As Worksheet
  Dim WS2 As Worksheet
  Dim v As Variant
  Dim vv As Variant
  Dim strDate As String
  Dim lngRowMax As Long
  Dim lngRowResult As Long
  Dim lngRow As Long
  
  Set WS1 = Worksheets("A")
  Set WS2 = Worksheets("B")
    
  lngRowMax = WS1.Range("A" & WS1.Rows.Count).End(xlUp).Row
  v = WS1.Range("C10:G10").Resize(lngRowMax - 9).Value
  ReDim vv(1 To UBound(v, 1), 1 To 6)
  strDate = WS1.Range("E6").Text
  For lngRow = 1 To lngRowMax - 9
    If v(lngRow, 1) <> "" Or v(lngRow, 2) <> "" Or v(lngRow, 3) <> "" Or v(lngRow, 4) <> "" Or v(lngRow, 5) <> "" Then
      lngRowResult = lngRowResult + 1
      vv(lngRowResult, 1) = strDate
      vv(lngRowResult, 2) = v(lngRow, 1)
      vv(lngRowResult, 3) = v(lngRow, 2)
      vv(lngRowResult, 4) = v(lngRow, 3)
      vv(lngRowResult, 5) = v(lngRow, 4)
      vv(lngRowResult, 6) = v(lngRow, 5)
    End If
  Next
  If lngRowResult > 0 Then
    WS2.Range("A" & WS2.Rows.Count).End(xlUp).Offset(1).Resize(lngRowResult, 6).Value = vv
    MsgBox lngRowResult & " "
  Else
    MsgBox " "
  End If
End Sub


Private Sub 列幅拡大_Click()
 Columns("C:f").Select
    Selection.EntireColumn.Hidden = fales
End Sub

Private Sub 列幅縮小_Click()
 Columns("C:f").Select
    Selection.EntireColumn.Hidden = True
    End Sub

Excel VBA互換機能

M.Kamataki (2009-10-05 23:36:38 (月))

OpenOffice.org 3.0から、Excelのマクロ(VBA)入りのファイルの実行が可能になっています。その基礎知識はお持ちでしょうか。ExcelファイルをCalcで読み込んで実行する方法は、以下の記事をお読みください。

「オープンソース統合オフィススイート「OpenOffice.org 3.0」到来!! 6.Excel VBAのサポート」
http://journal.mycom.co.jp/special/2008/ooo3/005.html

Calc上でも、マクロの先頭に「Option VBAsupport 1」というコードを記述しておくと互換性のあるExcel VBAが動作します。

ご質問の際に投稿されたマクロですが、上記の「Option VBAsupport 1」を加え、一部半角であるべき文字を全角から修正して、以下のサンプルを用意しました。

filefaq5_100sample1.ods

結果、「削除_Click()」「印刷_Click()」「列幅拡大_Click()」「列幅縮小_Click()」はそのままで動作可能でした。

「入力_Click()」は調べきっていないので、よくわからないVBAのコードがあり、動作しません。「Worksheet_Change()」は、引数が必要だと思うのですが、どのように与えるのかわからないので、わたしは動作させることができませんでした。

オリジナルのExcelファイルをサンプルとして添付していただくのが、このあたりの理解につながると思います。できたら、添付をお願いします。

さて、初心者とのことですが、まずOpenOffice.orgのVBA互換機能について、基礎的な理解を持っていただくことが必要ではないでしょうか。

無題

tani (2009-10-05 23:52:08 (月))

経験上、Option VBASupport 1を冒頭につけるとVBAの8割〜9割くらいのステップは動いたりします。ただマクロの場合「8割くらいのステップが動く」≒「動かない」になっちゃいます。

なので基本的にはUNO APIで書き換える必要があります。動かない箇所だけ書き換えてもいいんですが、そうするとVBAのコードとOpenOffice.org Basicのコードが混じってしまって、保守性がちょっと悪くなってしまうので、いっそ全部書き換えるほうがいいかもしれません。そのあたりの検討もされたほうが良いのではと思います。

OOo BasicとUNOに関してはまずは以下あたりを読んでみてください。
http://wiki.services.openoffice.org/wiki/JA/Documentation/BASIC_Guide

無題

tani (2009-10-06 00:04:46 (火))

ちなみにExcelでのWorksheet_Change()は、OOoでは自分でシート切り替えイベントのリスナーを設定したりする必要があるので、Option VBASupport 1がついていてもなんとなく引数の与え方というレベルの書き換えでは動かない気がします。

どこかで見た気が。。。

M.Kamataki (2009-10-06 01:01:50 (火))

どこかで見た気がしたので探してみると、はにゃ?さんのサイトでした。「入力_Click()」は、以下にCalcのマクロでの代替方法が紹介されています。

選択セルが変更されたときマクロを起動する方法。
http://hermione.s41.xrea.com/pukiwiki/pukiwiki.php?OOobbs2%2F1

「Worksheet_Change()」についても似たマクロが俎上に上がってますね。

無題

TAKA6855 (2009-10-06 07:49:35 (火))

沢山の、ご投稿いただき、有難うございました

カテゴリーなど変更

M.Kamataki (2009-10-06 07:53:07 (火))

TAKA6855さん、別質問でのコメントを統合し、当質問は完了としました。なお、カテゴリーも適当と思われるものに変更しました。

お名前:
題名:


添付ファイル: filefaq5_100sample1.ods 1518件 [詳細]