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

Q&A集[?]

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

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

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

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:1
昨日:1
総数:2994
現在:1


VBAとの互換性について

ページOpenOffice.org FAQの登録ページ
投稿者Atsushi
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2011-01-04 20:12:28 (火)
OSWindowsXP
依存するページ
バージョン
edit/refer

メッセージ

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

会社のOfficeソフトがOOoに変わったのですが、既存のExcelファイルを置き換えて
使いたくVBAサポート機能を使ってみましたが、やはり「無効な引数・・」というエラーが
出てNGになります。ステップモードで確認して見たところ次の構文だけがひっかる
状況です。

どこが悪いのか判りません。どなたか助けてください。

自分はVBA等全くの素人です。助けていただける方が居られましたら
できるだけわかりやすい言葉で教えてください。宜しくお願いします。

問題の1行 If Not IsNumeric(Range(開始Col & Ctr)) Or LenB(StrConv(Range(開始Col & Ctr), vbFromUnicode)) <> 6 Then

※『LenB』はOOo関数にないということですので『Len』に書き換えてみましたが
ダメでした。


vbFromUnicodeも怪しい

M.Kamataki (2011-01-04 23:43:07 (火))

vbFromUnicodeについて、OpenOffice.orgの不具合・要望データベースであるIssuTrackerを調べてみると、以下のIssue(課題)が見つかりました。

VBA: strconv function is not supported
http://ja.openoffice.org/issues/show_bug.cgi?id=85036

StrConvはサポートされたようですが、vbFromUnicodeはサポートされているかどうか。。。

LenBについて

M.Kamataki (2011-01-05 00:24:25 (水))

Issue(課題)は以下ですね。

Basic macro functions: StrConv, LeftB, LenB, MidB, and RightB
http://ja.openoffice.org/issues/show_bug.cgi?id=100953

とりあえず、問題の1行を以下のようにすると動作するでしょうか。

If Not IsNumeric(Range(開始Col & Ctr)) <> 6 Then

もし、ここが通ったとしても、他で通らないということも考えられます。問題は洗いだしておいた方が良いでしょう。

バージョンに注意

M.Kamataki (2011-01-05 01:42:44 (水))

Excelで以下のマクロを作成してみました。

Sub Main()
MsgBox LenB(StrConv("カタカナカタカナ", vbFromUnicode))
End Sub

サンプルファイルは以下です。

filefaq6_113LenB_sample.xls

Excelで実行すると、「12」がメッセージボックスに表示されます。半角の4バイトと全角の8バイトの合計数ですね。

OpenOffice.org 3.3のリリース候補版で実行すると、エラーにはならず、メッセージボックスに「6」が表示されました。LenB関数、StrConv関数はオプションまで含めてVBAを実行できるようです。ただし、返り値は間違っているようです。Atsushiさんがお使いの3.1.1や現行の最新版の3.2.1ではエラーが表示され実行できません。

このことから、上記で紹介されているIssueの#85036は3.3で取り込まれているようです。

なお、faq/4b/1087のコメント「無題」で紹介されているマクロをユーザー定義関数として、上記サンプルのExcelファイルをCalcで読み込んだ後のコードに追加すると、OpenOffice.org 3.1.1でもマクロが実行でき、期待する値の「12」を返してくれました。

こちらのCalcファイルもサンプルにしてみました。以下です。3.3リリース候補版で試してみても、うまく動作するようです。

filefaq6_113LenB_sample.ods

3.3での間違った結果6

はにゃ? (2011-01-05 02:30:20 (水))

xls ファイルの方を開き、
Linux 上の OOo 3.3rc8 での結果: 12、WinXP 上の OOo 3.3rc8 での結果: 6。変ですね…LenB はまだ使わないほうがいいと思います。

無題

tani (2011-01-05 11:28:11 (水))

●●B関数とStrConv関数を組み合わせて文字列チェックなどを行なっているVBAのコードはたまに見かけます。同じようにOOo Basicで文字コードの変換を行うと、あやしい動作が多かったように思いますので、OOo Basicでこの手のチェックを行う際は正規表現を使うのが無難かなと思います。参考までに。

テストの結果

ATSUSHI (2011-01-05 21:39:22 (水))

M.Kamataki
ありがとうございます。

faq6_113LenB_sample.odsを試してみましたが、添付ファイルのようなエラーが返されNGでした。

また、問題の1行を教えていただいた内容に変更し試してみましたが、
半角6桁の数字が入っているにも拘らず、どうも半角6桁の数字とは認識してくれなかった様です。やはりvbFromUnicodeが問題なのでしょうか?
今後もいろいろ試してみたいと思います。
ご面倒でなければご協力下さい。

宜しくお願いいたします。

faq6_113LenB_sample.odsエラー.jpg

正規表現・・

ATSUSHI (2011-01-05 21:47:09 (水))

tani様
ありがとうございます。
お恥ずかしい話ですが、当方ズブの素人ゆえ『正規の表現』が判っておりません。
いろいろググっても見たのですが、チンプンカンプンでした。
宜しければ『セル内の数字が半角6桁かどうかをチェックする』ことを目的にどう変えれば良いか教えてください。

宜しくお願いいたします。

Re: テストの結果

M.Kamataki (2011-01-06 00:15:18 (木))

faq/4/965「マクロが実行できない」のご質問が参考にならないでしょうか。同じ原因であれば、コメントの「ありがとうございました。」の作業を行うと、少なくともCalcの「ツール」-「マクロ」-「マクロの実行」ではエラーが出なくなるかもしれません。

なお、環境をいじるのが不安な場合は、以下のOpenOffice.org Portableを利用してみるのも良いかもしれません。インストール先はUSBフラッシュメモリだけでなく、適当なフォルダーも指定できます。

http://portableapps.com/apps/office/openoffice_portable/localization

Sample Code

new_OOo3 (2011-01-06 01:00:57 (木))

こんばんは。

>『正規の表現』が判っておりません。
>宜しければ『セル内の数字が半角6桁かどうかをチェックする』ことを目的にどう変えれば良いか教えてください。

=> との事ですので、算数に例えるならば「足し算」「引き算」のみを使ったSample Codeを以下に記します。
但し「足し算」「引き算」のみですので少し長めのCodeになります。
内容は
A1セル : 数字(123456)
A2セル :数字(1234567)
A3セル : 文字列(12あ226)
A4セル : 式(=1*2*100000)
A5セル :式(="a" & (A1-100000)
の各セルの値が「6桁の半角数字」であるかどうかを判定しているものです。

*********** Sample Code ************
Sub Main
	Dim oDoc as Object
	Dim oSheet as Object
	Dim oCell as Object
	Dim oVar as Variant
	Dim oLen as Integer
	Dim i, k as Integer
	Dim oDisp as String
	Dim oCharctor as String
	Dim oFlag as Integer
		oDoc = ThisComponent
		oSheet = oDoc.getSheets().getByIndex(0)
		oDisp = ""
		for i = 0 to 4
			oFlag = 0
			oCell = oSheet.getCellByPosition(0, i)
			If Sgn(oCell.Value) = 1 then
				oVar = oCell.Value
			else
				oVar = oCell.String
			End If
			oDisp = oDisp & oVar & Chr$(9) & "=> "		
			oLen = Len(oVar)
			If oLen = 6 then
				for k = 1 to 6				
					oCharctor = Mid(oVar, k, 1)
					If  ASC(oCharctor) < 48 or ASC(oCharctor) > 57 then
							oFlag = 777
					End If
				next k
				If oFlag <> 777 then
					oDisp = oDisp & "OK"
				else
					oDisp = oDisp & "NG"
				End If
			else
				oDisp = oDisp & "NG"	
			End If		
			oDisp = oDisp & Chr$(10)
		next i
		msgbox oDisp		
End Sub
*****************************************************
oSample.png

ここから先は個人的感想を記します。
本Q&Aに限らず、「緊急」や「重要」と質問投稿をして、回答を頂いたにも関わらずQ&Aを「完了」にするどころか、お礼の投稿さえ無いものが散見されます。
例えるならば、「新宿駅で人に道を尋ねられるが、行きたい処の住所も分からず、道を尋ねた本人が目印らしき事しか説明できずに「自分は道が分からないので連れってくれ」と懇願するで自分の時間を犠牲にしてなんとかそれらしき処につれて行くと突然足り出して人混みの中に「お礼」も言わずに消えていく人」が多い様に思えます。
質問者さんは上記の様な方では無いと思いましたので回答しました。
本Q&Aの管理人の方々は心が広いので回答を続けてくれますが、私はかなり心が狭いので上記のような行動を取られたら当分の間は「道を尋ねられても無視」します。
もし上記Codeにて解決された場合は「緊急」と記して直ぐに回答をされた、M.Kamatakiさん、はにゃ?さん、taniさんにお礼を記して本質問を完了にして下さい。

また、
>VBA等全くの素人
=>ならば、基のVBAの全てのCodeを記された方が良いと思います。
Fileの添付では無くCodeを記す事をお勧めします。個人的にはだれか知らない方が添付したマクロ付きのFileをDLするのは少し抵抗を感じますので

参考までに

管理人様へ
上記についてQ&Aとして不適切な表現がありましたら削除頂けます様お願いします。

皆様 ありがとうございます

Atsushi (2011-01-06 23:06:25 (木))

M.Kamatakiさま
アドバイスいただきありがとうございます。
内容を読ませていただいたところ、再インストール等の手段を講じる事か
と判断しましたが、会社の端末でインストールや書き出し等の行為は厳しく
制御されている状況ゆえここまで出来ない情況です。
アドバイスにお応えできず申し訳ありません。

new_OOo3様
はじめまして。

サンプルコードまで作っていただいてありがとうございます。
コード単体で試させて頂いたところ行けそうな感触でしたので、
教えていただいたコード全てを解決したい部分と入替えて見ましたが
素人ゆえの悲しさで、やはり失敗してしまいました。

仰る通りに、出来れば全てのVBA全てを公開し、どの部分を入替えれば
良いか教えていただきたいところですが、こちらも何やら開発元の『権利』
とかがあるらしく全てを公開するのは憚られます。
公開できそうな部分を抜き出してみたいと思いますので、もう少しお時間を
下さい。
『緊急』扱いにしておきながら申し訳ございませんが宜しくお願いいたします。

動作しない理由

ike@九州 (2011-01-07 10:10:22 (金))

何故動作しないか分かりました。

Range(開始Col & Ctr) をそのまま条件判断式内で使うのがいけないようです。
一度 Variant 変数に渡すとこちらの環境では上手く行きました

Option VBASupport 1
Sub hoge
Dim vValue As Variant
〜
vValue = Range(開始Col & Ctr)
If Not IsNumeric(vValue) Or LENB(vValue) <> 6 Then
〜
End Sub

Function LENB(s)
 Dim i, n, m
 n = 0
 m = len(s)
 For i = 1 to m
   If (Asc(Mid(s, i, 1)) < 256) Then
     n = n + 1 ' 半角文字の場合
   Else
     n = n + 2 ' それ以外の場合
   End If
 Next i
 LENB = n
End Function

動作しますでしょうか

誤解の部分だけ指摘

M.Kamataki (2011-01-07 10:54:25 (金))

本筋とは関係ないので簡単に。ike九州さんのアドバイスで解決するなら、以下は不要かもです。

>内容を読ませていただいたところ、再インストール等の手段を講じる事か
>と判断しましたが、会社の端末でインストールや書き出し等の行為は厳しく

faq/4/965を当ページの関連で抜き出すと、「Calc>ツール>マクロ>マクロを実行すると、scripting エラー(メッセージは wrong number) が発生」(Atsushiさんと同じ?)は、faq/1/202を見て「ユーザープロファイルを削除またはリネームすると解決」ということになります。再インストールは不要です。

Calc>ツール>マクロ>マクロを実行するで、scripting エラーが発生するようになった理由は、OpenOffice.orgを再インストールしてからと書かれています。古いOpenOffice.orgをアンインストール、さらにfaq/1/202で紹介したユーザー設定ファイルを削除(必要ならバックアップ)しインストールすると、この手のトラブルは防げます。

難しいですね。

new_OOo3 (2011-01-07 21:57:17 (金))

こんばんわ。

ike@九州さんが非常にSmartなCodeでアドバイスされ、M.Kamatakiが非常に具体的な回答をされているので、解決されたならば以下は無視して下さい。

質問の最初投稿に記してある
>問題の1行 If Not IsNumeric(Range(開始Col & Ctr)) Or LenB(StrConv(Range(開始Col & Ctr), vbFromUnicode)) <> 6 Then

だけの問題ならばike@九州さん&M.Kamatakiさんの回答で解決する筈です。
もし、解決されないならばM.Kamatakiさんが
>もし、ここが通ったとしても、他で通らないということも考えられます。問題は洗いだしておいた方が良いでしょう。

と記されている事が重要だと思います。

また
>開発元の『権利』とかがある

ものならば、数百行程度のCodeでは無いと推察されますので投稿されるのも少し問題があると思います。(サーバー負荷が増大しますので。)

個人的にはこれまでの質問者さんの回答から推察すると質問のIf文だけが問題とは考え難いです。

>公開できそうな部分を抜き出してみたい
との事ですが、個人的には断片的なCodeはあまり解決のヒントにはなり難く、最悪の場合、Errorがされない間違った結果を出すマクロになる可能性があると思います。

最後に
>解決したい部分と入替えて見ましたが素人ゆえの悲しさで、やはり失敗

=>との事ですがこれまでに記されている
・「無効な引数・・」というエラー
・Scripting Frameworkエラー
が表示されたのでしょうか?多分違うエラーメッセージが表示されているのではと勝手に想像しています。
もし、ike@九州さん&M.Kamatakiさんの回答で解決しない場合は以下の事項を記される事をお勧めします。

1) 目的のマクロの簡単なWorkFolowを記す。
つまり、私が記したCodeの場合は
Calcの任意のセルのDataを取得 => ⊂魴錣砲△DataかCheck => 3謄札襪Check結果を表示
の3stepのWorkFollowとなります。

2) 利用するDataの条件
つまり
ー蠧力の数字(半角、全角混じり)で式による計算結果のセルは無い。
⊆蠧力の数字、文字列(半角、全角混じり)で式による計算結果は無い。
手入力及び計算結果のセルが混じっている。
ぃ韻弔Fileの1つのSheetからのみDataを取得している。
等です。

3)単体のCodeかどうか?
つまり、
ike@九州さんのCodeのような「Function」を使っているか?
◆Subroutine」を使っているか?
J数のマクロを呼び出しているか?
等です。

4)解決されない時に表示されるエラーメッセージ

以上、参考までに。

ありがとうございます

Atsushi (2011-01-07 22:37:43 (金))

こんばんは。
皆様のご協力 本当にありがとうございます。
また日中PCを開ける時間が短く、いつもこんな時間の返答になりすみません。

M.Kamataki 様>
いつもありがとうございます。
観点を誤っていたようです。早速覗いてみようとしましたが、セキュリティがかけてありC:以下が覗けませんでした。
ちなみに今使っている3.1.1は初めて導入されたものらしいのですが、その場合もこの件は当てはまりますでしょうか?

<new_OOo3 様>
アドバイスありがとうございます。
元のVBAの内容に勝手ながら***で隠す等の手を加えたものですが、数百行にも及びませんので載せさせていただきます。
★をつけた行が問題の部分で、ここを無効にするとスンナリ『成功しました』のメッセージにたどり着けます。
こんな内容でお判りになりますでしょうか?

<ike@九州様>
はじめまして。アドバイスありがとうございます。
是非試してみたいのですが、恥ずかしながらどの部分を書き換えれば良いのか判っていません。
下記元Codeの星の部分を書き換えるのは出来そうなのですが、Dim・・の行やFunction LENB(s)以降を
どこに書き足すのか分かりませんでした。申し訳ございませんが下記元VBAのどこを換えれば良いのか教えてください。


以下 元VBAです。
***の部分は拠点や端末、ユーザーの情報取得や、Logの書き出しの様です。
これなら開発元様のご迷惑にならないかと思い、***で隠させていただきました。
皆様どうか宜しくお願いいたします。

Option Explicit

Const 保存Path = "\\**********"  ⇒生成データの保存先です~~

Sub 登録()

   Dim 開始Cell, 開始Col, 開始Row, 社員Col, 削除Col, Ctr, Env, 店舗名, ユーザ名, マシン名
   Dim Fso, TxtFile, Tmp1, Tmp2, Tmp3, Tmp4, LogFile, ExecTime

   If MsgBox("データを登録します。宜しいですか?", vbOKCancel + vbQuestion) = vbCancel Then Exit Sub
 
   '初期設定
   開始Cell = "B9": 開始Col = "B": 開始Row = 9
   社員Col = "C"
   削除Col = "D"

   ********
   ********
   ********
   ********
   ********
   ********
   ********
   
   ********
   ********
   ********
   ********

'-----------------------------------------------------------------
'   入力チェック

   '全レコード入力チェック
   Ctr = 開始Row
   Do While Range(開始Col & Ctr) <> ""

★ 'IDナンバーが半角数字6桁かチェック
★ If Not IsNumeric(Range(開始Col & Ctr)) Or LenB(StrConv(Range(開始Col & Ctr), vbFromUnicode)) <> 6 Then
★     MsgBox 開始Col & Ctr & "セルに半角数字6桁のIDナンバーを入力して下さい。", vbOKOnly + vbCritical
★     Range(開始Col & Ctr).Select
★     Exit Sub
★ End If

   '氏名が全角10桁かチェック
   Range(社員Col & Ctr) = StrConv(Range(社員Col & Ctr), vbWide)
   If Range(社員Col & Ctr) = "" Or Len(Range(社員Col & Ctr)) > 10 Then
       MsgBox 社員Col & Ctr & "セルに全角10文字の氏名を入力して下さい。", vbOKOnly + vbCritica
       Range(社員Col & Ctr).Select
       Exit Sub
   End If

   'データ削除の為の入力値をチェック
   If Range(削除Col & Ctr) <> "" And Range(削除Col & Ctr) <> "1" Then
       MsgBox 削除Col & Ctr & "セルを「1」もしくは空にして下さい。", vbOKOnly + vbCritical
       Range(削除Col & Ctr).Select
       Exit Sub
   End If

   Ctr = Ctr + 1
  Loop
   
'---------------------------------------------------------------------------------------------------
'  固定長ファイル作成

   ********
   ********
 
   ********
   ********
   ********
 
   ********
   ********
   ********
   ********
   ********
   
   Loop
   TxtFile.Close
   Set TxtFile = Nothing
   
'--------------------------------------------------------------------------------
'   ログファイル作成
 
   ********
   ********
   ********
   ********
   ********
   ********
   ********
   LogFile.Close
   Set LogFile = Nothing
   Set Fso = Nothing
   MsgBox "登録に成功しました。", vbOKOnly + vbInformation
   ActiveWorkbook.Save
   Exit Sub
 
ErrHandling:
   MsgBox "登録に失敗しました。" & vbCr & vbCr & _
       Err.Description, vbOKOnly + vbCritical
   Set TxtFile = Nothing
   ********
   ********
   ********
   ********
   ********
   ********
   ********
   LogFile.Close
   Set LogFile = Nothing
   Set Fso = Nothing
   ActiveWorkbook.Save
 
End Sub


真は IsNumeric(Range(開始Col & Ctr)) に原因

ike@九州 (2011-01-08 12:17:28 (土))

Excel、OOo 共用でも動作するように変更しました
ユーザー関数 LenHN は
ID の文字全てが半角数字 0〜9 の場合のみ正しい桁数を返します

If Not IsNumeric(Range(開始Col & Ctr)) Or LenB(StrConv(Range(開始Col & Ctr), vbFromUnicode)) <> 6 Then

を、以下に変更

If LenHN(Range(開始Col & Ctr).Value) <> 6 Then

以下の Function 〜 を一番最後の End Sub の次の行にコピペして下さい

Function LenHN(s)
   Dim i
   For i = 1 To Len(s)
    If (Asc(Mid(s, i, 1)) > 57) Or (Asc(Mid(s, i, 1)) < 48) Then
      LenHN = 0
      Exit Function
    End If
   Next i
   LenHN = Len(s)
End Function

Option VBASupport 1 の場合、
Range(hoge) オブジェクトは"値"を使用する場合は
Range(hoge).Value と記述した方が良いという事ですね

Range(hoge).Select はそのままです

すばらしい!!

Atsushi (2011-01-08 18:05:39 (土))

ike@九州様

的確なアドバイス本当にありがとうございます。感謝・感激です。
ご指導頂いたとおりに変更したところ、見事にクリアできました。(感動しました)
テストデータの登録もLogの記録も出来ているように見受けられます。
実用に問題ないと思われますが、一応週明けに開発元に確認します。

これまで私のようなど素人にお付き合いいただいた M.Kamataki様、はにゃ? 様、tani様、new_OOo3様、
本当にありがとうございました。

これを機会にもっと勉強したいと思います。

この案件に関してはこれにてクローズとさせていただきます。
またの機会に宜しくお願いいたします。

訂正がありました。

ike@九州 (2011-01-10 09:25:24 (月))

検証不足で申し訳ありません。m(_ _)m

前回 Function 同様
判定をスルーする組み合わせがありましたので
正しくないときは 0 を返すように訂正いたしました。

Re: テストの結果

M.Kamataki (2011-01-11 12:16:39 (火))

「スクリプトフレームワークのエラー」が表示される原因としては、イベントの割り当てが適正でなかった場合もありえますね。faq/6/114参照。

お名前:
題名:


添付ファイル: fileoSample.png 820件 [詳細] filefaq6_113LenB_sample.odsエラー.jpg 766件 [詳細] filefaq6_113LenB_sample.ods 1025件 [詳細] filefaq6_113LenB_sample.xls 1114件 [詳細]