- ベストアンサー
VBスクリプトで他条件分岐を作成する方法
- VBスクリプトを使用して、指定の条件に基づいて値を編集する方法について説明します。
- Windows PCで利用できるVBスクリプトを使用して、印刷ソフトの設定に接続されているデータソースの値に対して編集を行う方法を解説します。
- VBスクリプトを利用して、データソースの値を読み込み、指定の条件に基づいて編集し、値を返す処理の方法について説明します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>no.4とno.5がno.1のパターンで編集 されてしまいました。 パターンで言われるよりも、例を示していただいたほうがよいと思います。 ご指摘な部分は、確認できていませんが、コードを短縮してみました。 n = Value Select Case True Case Left(n, 2) = "3A" And Len(n) = 14 And InStr(1, n, "-", 1) = 0 Value = Left(n, 3) & "-" & Mid(n, 4) Case Left(n, 1) = "3" And Len(n) = 14 And InStr(1, n, "-", 1) = 9 Value = Left(n, 3) & "-" & Mid(n, 4, 11) Case Len(n) = 14 And InStr(1, n, "-", 1) = 9 Value = Left(n, 3) & "-" & Mid(n, 4, 11) Case Len(n) = 14 And InStr(1, n, "-", 1) = 0 And Left(n, 1) = "3" Value = Left(n, 5) & "-" & Mid(n, 6, 5) & "-" & Mid(n, 11, 2) & "-" & Mid(n, 13, 2) Case Len(n) = 14 And InStr(1, n, "-", 1) = 0 Value = Left(n, 3) & "-" & Mid(n, 4, 5) & "-" & Mid(n, 9, 2) & "-" & Mid(n, 11, 2) & "-" & Mid(n, 13, 2) Case Else Value = n End Select
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
>no.1のパターンは編集されましたが >no.4とno.5がno.1のパターンで編集 >されてしまいました。 今、関わっている #6200348「エクセルでマクロの記録が出来ません。」側を一度、参考にしてください。9Xとか、数字と文字は違いますが、同じスタイルだと思います。もしダメなら、こちらも再検討します。
お礼
>もし、補足で書かれた内容で動くなら、以下のようにすればよいです。 >でも、これは、VBScript なんかじゃありません。 >前回の内容を少し替えただけです。 >今回の細かい仕様は分かりませんから、標準的な関数も使えるのかも不明では、 >なんとも言いようがありません。 このように回答をもらっており恐縮なのですが、 QNo.6198175-ANO.2の n = Value Select Case True ----省略----- Case Else Value = n End Select Next は 'Next にするだけで動作しました。(一部誤編集は除いて) (これはソフトがそうアラームしたので) QNo.6153785-ANO.2で教えていただいた、 'VBScript Dim myData Dim mValue Dim buf Const vbNarrow=8 myData = Array("41234564811114", "12345-12345", "12345678-12345", "31234567890123", "3A145677812300") For Each n In myData n = Trim(n) Select Case True ----省略----- Case Else mValue = n End Select 'MsgBox mValue Next は動作がしなかったです。でアラームも(構文が不正です)だけでした。 'VBScript Dim myData Dim mValue Dim buf Const vbNarrow=8 '削除 'myData = Array("41234564811114", "12345-12345", "12345678-12345", "31234567890123", "3A145677812300") '削除 'For Each n In myData '追加 n=Value -----省略----- '削除 'Next '追加 Value =mValue と修正したら動作した理屈がわかりません。(ただし、一部誤編集は同じ) 誤編集についてはどちらも省略部分の条件分岐と処理の部分を修正すれば 誤編集もなくなりその理由もわかったのですが この動作する、しないが私には検討もつきません。 どうもありがとうございました。
補足
いろいろすいません。 サンプルは以下のように準備し結果は以下のとうりでした。 なお使用するデーターベースは他で教えてもらっている 方を利用することにしましたので 3頭→9頭 3A頭→9X頭 にしています。 1.12345678901234(先頭が9以外で14文字) ↓ 123-45678-90-12-34 (3と4、8と9、10と11、12と13桁の間に半角ハイフンを入れる) 【OK】 2.55555-55555(5ケタ ハイフン 5ケタ) ↓ 55555-55555(変換しない) 【OK】 95555-55555(先頭が9で5ケタ ハイフン 5ケタ) ↓ 95555-55555(変換しない) 【OK】 9X555-55555(先頭が9Xで5ケタ ハイフン 5ケタ) ↓ 9X555-55555(変換しない) 【OK】 3.88888888-55555(8桁ハイフン5桁) ↓ 888-88888-55555(3と4、8と9桁の間に半角ハイフンを入れる) 【OK】 988-88888-55555(先頭が9で8桁ハイフン5桁) ↓ 988-88888-55555(3と4、8と9桁の間に半角ハイフンを入れる) 【OK】 9X888-88888-55555(先頭が9Xで8桁ハイフン5桁) ↓ 9X888-88888-55555(3と4、8と9桁の間に半角ハイフンを入れる) 【OK】 4.9123456789012A(先頭が9で14桁) ↓ 91234-56789-01-2A(5と6、10と11、12と13桁の間に半角ハイフンを入れる) が正規のところ ↓ 912-34567-89-01-2A (3と4、8と9、10と11、12と13桁の間に半角ハイフンを入れる) で【NG】です。 5.9X123456789012(先頭が9Xで14桁) ↓ 9X1-23456789012(3と4桁の間に半角ハイフンを入れる) 【OK】 NO.2とNO.3は3種類記載しましたが これは、質問以前にいろいろ作成していた時に 基本的に14桁。で頭が9か9Xかそれ以外でNO.1が基本編集で NO.4とNO.5で9と9Xで条件を付けていたのですが 例外パターンのNO.2とNO.3で頭が9と9Xが来た場合 全部NO.4とNO.5になってしまったので NO.2とNO.3にも9と9X頭を追加して こちらが誤編集されないようにという事で記述しました。 最初に教えていただいた記述を修正したら 質問前に苦闘していた時と同じくNO.2とNO.3にて頭に9と9Xがくると NO.4に編集されてしまう。 88888-55555 → 88888-55555 【OK】 98888-55555 → 988-88555-55 【NG】 9X888-55555 → 9X8-885-55-55 【NG】 かつ 9123456789012A →91234-56789-01-2Aになってほしいが 912-34567-89-01-2Aというのは直らずです。 で、その後、なんとか修正できて 解決しました。ありがとうございます。
- Wendy02
- ベストアンサー率57% (3570/6232)
>親オブジェクトとはこの場合、どれを指すのでしょうか? 根本的な部分のオブジェクト(プログラムの集合体でひとつの体系を為すもの)が理解していないからです。本来、直接、Value というプロパティに入れるような、VB系の言語に、そのような仕様を持つものはありません。 >ソフトはすごく簡単です。 ?使い方の説明は必要はないのですが……。 掲示板で、ソフトの名前を言えないようなものの質問は控えたほうがよいと思います。 >資料の無断転載はいけないと思い、自分で理解した内容で質問しています。 引用と転載とは違います。どういうソフトのどこのヘルプやマニュアルのどこに書かれている内容か、必要な分を掲示するというのは、著作権法で認められた行為です。 もし、補足で書かれた内容で動くなら、以下のようにすればよいです。でも、これは、VBScript なんかじゃありません。前回の内容を少し替えただけです。今回の細かい仕様は分かりませんから、標準的な関数も使えるのかも不明では、なんとも言いようがありません。 '(基本的に全角空白は絶対にいれないでください。ハングする可能性があります。) n = Value Select Case True Case Left(n, 2) = "3A" And Len(n) = 14 And InStr(1,n, "-",1) = 0 Value = Left(n, 3) & "-" & Mid(n, 4) Case Left(n, 1) = "3" And Len(n) = 14 And InStr(1, n, "-", 1) = 9 n = Replace(n, "-", "",1, -1 ,1) Value = Left(n, 3) & "-" & Mid(n, 4, 5) & "-" & Mid(n, 9, 5) Case Len(n) = 14 And InStr(1,n, "-",1) = 9 n = Replace(n, "-", "",1 , -1, 1) Value = Left(n, 3) & "-" & Mid(n, 4, 5) & "-" & Mid(n, 9, 5) Case Len(n) = 14 And InStr(1,n, "-",1) = 0 Value = Left(n, 3) & "-" & Mid(n, 4, 5) & "-" & Mid(n, 9, 2) & "-" & Mid(n, 11, 2) & "-" & Mid(n, 13, 2) Case Else Value = n End Select Next 最後に、私個人も、いくつかのソフトの独特の、マクロ・スクリプト言語を持っているものがありますが、それは、言語として完全に成り立っているものではないから、必ずしも使いこなせるものではありません。 そういうものは、自分で勉強していくしかないと思います。まして、VBScript に似ているというだけでは、どうにも解決するとは思えないのです。同じソフトを使っている同好の人たちのサイトさえあれば、情報交換から、ある程度の目処が立ちますが、こういうグローバルな掲示板で、ソフト名さえ公開しないというなら、そもそも無理な質問だと思っていただいたほうが良いと思いますね。
お礼
他の事もいろいろ教えていただきまして、すいません。 教えていただいた記述を入れてみました。 :Nextが不正です。 とアラーとが出ました。 でこのNextを削除したら、 思ったとうりに動作をしました。 5種類全部調べましたが完璧に編集されて表示されます。 本当にありがとうございました。
補足
すいません。早合点でした。 no.1のパターンは編集されましたが no.4とno.5がno.1のパターンで編集 されてしまいました。 せっかく記述していただいので ところどころ修正しながら、試します。 ありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
前回と同じ内容のようです。 この部門は、VBカテゴリでも、こちらのOffice系カテゴリでも同じ分野の質問に関しては、専門的な分野は同じ人が答える可能性が高いです。だから、私の指摘したポイントをクリアしていないと、どこで質問されても同じになってしまいます。 >VBスクリプト(Microsoft Visual Basic Scripting Edition) >とは、Windows PCで使用できるスクリプト言語です。 >Visual BasicやOfficeのVBAとは似ていますが、別の言語となります。 と書かれても、こんなあたりまえの説明は不要です。 しかし、問題は、VBScript との相違点です。 >ようするにValueから値を読み込み、値を編集してValueに返すという >処理をすることになります。 >例えばデータソース 3A500100000099 の 3A5と00100000099の間(3文字目のあと)に >ハイフンを入れるスクリプトであれば > > str = Value > Value = Left(str,3) & "-" & Mid(str,4,14) この記述では、VBAでも、VBScript でもありえないのです。VB系を知らない人のコードだと思います。 >(データソースはExcelからデータベースフィールドで取得し、 > 値をその他のオプションのVBスクリプトで後処理します) データソースは、どうやって取るのでしょうか。ODBC、ADO、DAO、それともオートメーションでしょうか。 オブジェクトの意識がまったくなく、それが書かれていません。 前回も書いたことを、具体的に書くと、もし、上記のコードがある程度の痕跡を持っているとしたら、 Dim str With ○○○ ←この部分(Valueの親オブジェクト)が分からなければ、エラーが返ります。 str = .Value '本当は、strは、VB系では関数だから、私は使わない。 .Value = Left(str,3) & "-" & Mid(str,4,14) End With 前回書いたように、Value の親オブジェクトは何か、それを書かない限りは無理です。 せめてソフト名を書けば、こちら側でも調べます。その内容を明かさないままに、VBスクリプト様のものを、VBScript だと言われても、解決は難しいのです。あまり専門的な内容を書くと、逆に混乱するから書かないけれども、ヘルプの参考資料があるなら、変数の宣言の部分から、完全に動くものを、そのまま貼り付けてほしいものです。でも、なぜ、ソフト名を書けないのでしょうか?プライバシーの問題?もし、そういう事情があるなら、あまり掲示板では、業務に関してはお聞きならずに、メーカーに聞いたほうが良いと思います。
お礼
2010年9月23日。 いろいろありがとうございました。 n = Value Select Case True Case Left(n, 2) = "3A" And Len(n) = 14 And InStr(1,n, "-",1) = 0 Value = Left(n, 3) & "-" & Mid(n, 4) Case Left(n, 1) = "3" And Len(n) = 14 And InStr(1, n, "-", 1) = 9 n = Replace(n, "-", "",1, -1 ,1) Value = Left(n, 3) & "-" & Mid(n, 4, 5) & "-" & Mid(n, 9, 5) Case Len(n) = 14 And InStr(1,n, "-",1) = 9 n = Replace(n, "-", "",1 , -1, 1) Value = Left(n, 3) & "-" & Mid(n, 4, 5) & "-" & Mid(n, 9, 5) Case Len(n) = 14 And InStr(1,n, "-",1) = 0 Value = Left(n, 3) & "-" & Mid(n, 4, 5) & "-" & Mid(n, 9, 2) & "-" & Mid(n, 11, 2) & "-" & Mid(n, 13, 2) Case Else Value = n End Select で動作しています。 4.3○○○○○○○○○○○○○(先頭が3で14桁) ↓ 3○○○○-○○○○○-○○-○○ (5桁と6桁、10桁と11桁、12桁と13桁の間に半角ハイフンを入れる) だけが、 パターン1の編集内容である ○○○-○○○○○-○○-○○-○○ (3桁と4桁、8桁と9桁、10桁と11桁、12桁と13桁の間に半角ハイフンを入れる) で編集されてしまいます。 それ以外は完璧に編集できています。 この部分かなと思い Case Left(n, 1) = "3" And Len(n) = 14 And InStr(1, n, "-", 1) = 9 n = Replace(n, "-", "",1, -1 ,1) Value = Left(n, 3) & "-" & Mid(n, 4, 5) & "-" & Mid(n, 9, 5) ところどころ修正してもこの症状は修正されず、 代わりに正常だったパターンが誤編集されてしまいました。 残りのパターンは編集されて印刷されていますしここらが限界かなと思います。 本当にどうもありがとうございました。
補足
申し訳ありません。 別に質問方式を変えて回答を得たかったわけではありません。 前回の質問は締め切ってしまい、 サポートに問い合わせ、情報を得たので再質問をしました。 サポートで使い方は教えてくれても、記述まではサポート外でした。 また資料の無断転載はいけないと思い、自分で理解した内容で質問しています。 ちなみに >例えばデータソース 3A500100000099 の 3A5と00100000099の間(3文字目のあと)に >ハイフンを入れるスクリプトであれば > > str = Value > Value = Left(str,3) & "-" & Mid(str,4,14) において str をAAAにしてみて AAA = Value Value = Left(AAA,3) & "-" & Mid(AAA,4,14) にしても変換されて表示されました。 ですからこのstrをベースに記述をすれば他条件分岐の記述を書けるのかなと 思いました。 >前回書いたように、Value の親オブジェクトは何か、それを書かない限りは無理です。 この親オブジェクトというのが言葉の意味がわかりませんので 何を伝えていいのかわかりません。 ソフトはすごく簡単です。 用紙サイズを決めると 年賀状作成ソフトのようにそのサイズで画面に白紙枠が表示されます。 エクセルのオートシェイプと同じ要領で その表示内にオブジェクトを挿入します。 でそこに文字入力をすればそれがそのまま印刷されます。 文字の拡大や位置などもエクセルのオートシェイプと おなじ要領です。オブジェクトをつかんで移動や拡大縮小、 また子画面を開いて、フォントや色、位置のミリ指定など) でそのオブジェクト部分をダブルクリックすると、 プロパティ画面になり、 ・画面データ(自分で入力) ・日付(システム日付から) ・シリアルNO. ・データーソース などの選択があります。 でデーターソースを選択すると どのデーターソースを利用するか入力画面になり 例えばマイドキュメントの売上というフォルダの 2009年とういうエクセルファイルのB列と指定します。 そうすると画面にはそのエクセルのデータのB列の 値を表示します。 エクセルに12345678901234と入力されていれば 画面にも12345678901234と表示されます。 でこのデータソース選択画面で VBスクリプトをONにして出てきた入力画面に str = Value Value = Left(str,3) & "-" & Mid(str,4,14) と入力して決定すると 先ほどは 12345678901234と表示されていたのが 123-45678901234と表示されます。 親オブジェクトとはこの場合、どれを指すのでしょうか?
お礼
2010年9月27日16:48トライ結果です。 使用データーベースを頭3と頭3Aがあるものから 頭9と頭9Xの方に変更したので記述がそうなっています。 ・9月22日QNo.6198175-ANO.2で教えていただいた方の記述を修正 n = Value Select Case True 'パターン5の編集 9X頭で計14桁かつハイフンがない Case Left(n, 2) = "9X" And Len(n) = 14 And InStr(1,n, "-",1) = 0 '3-11でハイフン編集をする Value = Left(n, 3) & "-" & Mid(n, 4) '以下から下の行は削除 'パターン3の編集1 9頭で計14桁かつハイフンがある 'Case Left(n, 1) = "9" And Len(n) = 14 And InStr(1, n, "-", 1) = 9 'ハイフンを抜いて9頭で計13桁にする 'n = Replace(n, "-", "",1, -1 ,1) '3-5-5でハイフン編集する 'Value = Left(n, 3) & "-" & Mid(n, 4, 5) & "-" & Mid(n, 9, 5) 'このパターン3の編集1について '9頭と9X頭の定義が別文で指定されている 'それは9頭の計14桁ハイフン無しと9X頭の計14桁ハイフン無し 'よって計14桁でハイフンがあれば頭9も9Xもそれ以外も 'パターン3の編集2でモーラされるので省いてもいいのでは? 'ここまでの行は削除する 'ここから下の行は追加(編集不良の対策 パターン4の定義が欠如の為追加) 'パターン4の編集 9頭で計14桁かつハイフンがない Case Left(n, 1) = "9" And Len(n) = 14 And InStr(1, n, "-", 1) = 0 '5-5-2-2でハイフン編集 mValue = Left(n, 5) & "-" & Mid(n, 6, 5) & "-" & Mid(n, 11, 2) & "-" & Mid(n, 13, 2) 'ここから上の行まで追加(編集不良対策) 'パターン3の編集2-基本型8桁ハイフン5桁で計14桁 '頭は問わず計14桁でハイフンがある 'この定義で9頭と9X頭の8桁ハイフン5桁で計14桁はモーラできるはず Case Len(n) = 14 And InStr(1,n, "-",1) = 9 'ハイフンを抜いて13桁にする n = Replace(n, "-", "",1 , -1, 1) '3-5-5でハイフン編集する Value = Left(n, 3) & "-" & Mid(n, 4, 5) & "-" & Mid(n, 9, 5) '1の編集 頭は問わず計14桁でハイフン無し '9頭と9X頭はすでに条件分岐しているのでこれでいい Case Len(n) = 14 And InStr(1,n, "-",1) = 0 '3-5-2-2-2でハイフン編集 Value = Left(n, 3) & "-" & Mid(n, 4, 5) & "-" & Mid(n, 9, 2) & "-" & Mid(n, 11, 2) & "-" & Mid(n, 13, 2) '上記までの条件に該当しない物 パターン2の編集はここに含まれる Case Else 'その場合編集はしないで値を返す Value = n End Select '削除 'Next これだとパターン4が 90000000000000A→90000000000000Aで編集されません。 本来は90000-00000-00-0Aです。 現在正常編集できているQNo.6153785で教えていただいた物を修正した物 (このA-NO.4の補足の記述) と変わりないと思うのですが、なぜか駄目です。 まだ原因が不明です。 なお ・この回答9月26日QNo.6198175-ANO.4で教えていただいた物をそのまま使用した場合 全パターン正常に編集できました。 ありがとうございました。
補足
この回答をいただく前の9月24日深夜に修正完了し報告したかったのですが 補足もお礼も使い果たしできませんでした。大変申し訳ありません。 内容は一番最初9月4日QNo.6153785で教えていただいた物を修正です。 (9月4日QNo.6153785-ANO.2で教えていただいた物は動作がしなかったのですが 以下の様にしたら動作はしました。ですがNO.4の編集は正しくないです。) 9月22日QNo.6198175-ANO.2で教えていただいた物は動作はしますがNO.4の編集は正しくないです。) なお使用データーベースを頭3と頭3Aがあるものから 頭9と頭9Xの方に変更したので記述がそうなっています。 記述が完璧かの裏づけはないのですが、 現在実データーで検証中で5種類とも変換できています。 今日は勉強の為9月22日QNo.6198175-ANO.2で教えてもらった方の記述を修正してみます。 その後この回答9月26日QNo.6198175-ANO.4と見比べてみます。) VBScript Dim myData Dim mValue Dim buf Const vbNarrow=8 '削除 'myData = Array("41234564811114", "12345-12345",_ "12345678-12345", "31234567890123", "3A145677812300") 'For Each n In myData '追加 n=Value n = Trim(n) Select Case True '5の編集 9X頭で14桁、ハイフンがない? Case Left(n, 2) = "9X" And Len(n) = 14 And InStr(1,n, "-",1) = 0 '3-11でハイフン編集 mValue = Left(n, 3) & "-" & Mid(n, 4) 'ここから下の行は削除 '3の編集 8桁-5桁の選択(1)9頭で計14桁でかつハイフンが1個ある? 'Case Left(n, 1) = "9" And Len(n) = 14 And InStr(1, n, "-", 1) = 9 'ハイフンを抜く 'n = Replace(n, "-", "",1, -1 ,1) '3-5-5でハイフン編集 'mValue = Left(n, 3) & "-" & Mid(n, 4, 5) & "-" & Mid(n, 9, 5) 'ここから上の行まで削除 'ここから下の行は追加(動作不良の対策) '4の編集 9頭で14桁、ハイフンがない? Case Left(n, 1) = "9" And Len(n) = 14 And InStr(1, n, "-", 1) = 0 '5-5-2-2でハイフン編集 mValue = Left(n, 5) & "-" & Mid(n, 6, 5) & "-" & Mid(n, 11, 2) & "-" & Mid(n, 13, 2) 'ここから上の行まで追加(動作不良対策) '3の編集 8桁-5桁の選択(2)先頭は条件無しで計14桁でハイフンが1個ある? Case Len(n) = 14 And InStr(1,n, "-",1) = 9 'ハイフンを抜く n = Replace(n, "-", "",1 , -1, 1) '3-5-5でハイフン編集 mValue = Left(n, 3) & "-" & Mid(n, 4, 5) & "-" & Mid(n, 9, 5) '1の編集 14桁でハイフンがない? Case Len(n) = 14 And InStr(1,n, "-",1) = 0 '3-5-2-2-2でハイフン編集 mValue = Left(n, 3) & "-" & Mid(n, 4, 5) & "-" & Mid(n, 9, 2) _ & "-" & Mid(n, 11, 2) & "-" & Mid(n, 13, 2) '非該当の場合 Case Else 'データをそのまま表示する mValue = n End Select 'MsgBox mValue '削除 'Next '追加 Value =mValue 4.9123456789012A(先頭が9で14桁) ↓(5-5-2-2) 91234-56789-01-2A (5と6、10と11、12と13桁の間に半角ハイフンを入れる) 【OK】