- ベストアンサー
VBAコードの簡略化方法
- VBAコードの宣言を簡略化する方法について教えてください。
- VBAで長いコードを短くする方法を教えてください。
- VBAコードの冗長性を解消する方法について教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
1つの変数の宣言と初期化を1行で済ませたいのなら、 Dim a As String : a = "○○" Dim b As String : b = "○○" Dim c As String : c = "○○" (以下略) と書くと多少はすっきりします。 そうではなく、「変数が多すぎて大変……」という話であれば、 1つのメソッドにいろいろと詰め込みすぎなのかもしれません。 設計を見直し、処理を複数のメソッドに小分けするといいでしょう。
その他の回答 (5)
- samz_
- ベストアンサー率91% (11/12)
例えば、 Dim DAY As String Dim WEEK As String Dim MONTH As String DAY = "日" WEEK = "週" MONTH = "月" みたいな事をしていたとして、Dictionaryを使って下記の様に してはどうでしょうか? Dim strHoge As String strHoge = "DAY,日/WEEK,週/MONTH,月" Dim x() As String Dim y() As String Dim z As New Dictionary Dim ixLoop As Integer x = Split(strHoge, "/") For ixLoop = 0 To UBound(x) y = Split(x(ixLoop), ",") ReDim Preserve y(1) z.Add y(0), y(1) Next MsgBox z.Count MsgBox z("WEEK") & vbCrLf & z("MONTH") まぁこれだと、 WEEK = "週" ってしていたのが、 z("WEEK") = "週" になってしまいますが・・・ ※参照設定で、[Microsoft Scripting Runtime]をチェックしておきます もし参照設定しない場合は、 Dim z As New Dictionary の部分を、 Dim z As Object Set z = CreateObject("Scripting.Dictionary") にして下さい また、<strHoge = "DAY,日/WEEK,週/MONTH,月">の部分がものすごく長くなる場合は、 strHoge = "DAY,日/WEEK,週/MONTH,月" & _ "/YEAR,年" の様に複数行に分けるか、 strHoge = "DAY,日/WEEK,週/MONTH,月" strHoge = strHoge & "/YEAR,年" みたいにしても良いかと思います
補足
すいません、、 初心者なものでコードが全く理解できません(・_・;)
- nda23
- ベストアンサー率54% (777/1415)
いっそ「向こうの世界」で処理したら? つまり、VBSの世界を別に作って、そちらで仕事する方法です。 Dim 別世界 As Object '別世界を作る Set 別世界 = CreateObejct("ScriptControl") 別世界.Language = "VBScript" '別世界で変数を定義する Dim 変数配列, 変数要素 変数配列 = Split("aa,bb,cc,dd", ",") For Each 変数要素 In 変数配列 別世界.ExecuteStatement "Dim " & 変数要素 Next '別世界の変数に値を仕込む Dim 設定配列, 設定要素 Dim 索引 As Long 設定配列 = Split("○○,●●,□□,■■", ",") For Each 設定配列 In 設定要素 '例えば aa = "○○" という文を作成して実行する 別世界.ExecuteStatement 変数配列(索引) & "=""" & 設定要素 & """" Next '別世界からこちらへ値を取り出す Dim AA AA = 別世界.Eval(変数配列(0)) AA = 別世界.Eval("cc") JavaScriptですと、変数定義と値の設定が同時にできて、 日本語の変数名も可能です。 別世界.Language = "JavaScript" 別世界.ExecuteStatement "var 平日 = '○○';" 別世界.ExecuteStatement "var 夜間 = '●●';" VBAではできないメソッドなども使用できます。 何より、実行するステートメントをプログラマブルに作成できます。 ステートメントをファイルに入れて、読み込みながら実行などもOKです。 動的な処理(変数の個数が一定しない等)では有力かと思います。 でも、知らない人が見ると「なんじゃコリャ」ですけどね。
お礼
まさかこんな方法があるなんて(・_・;) 感動を覚えました、、 ベストアンサーにしたいぐらいなのですがJavaがわからないので泣
- mt2008
- ベストアンサー率52% (885/1701)
変数の宣言を1行で行う場合は↓の様にします。 dim a as string, b as string, c as string, d as string, …… ときどき見かける↓の様な宣言では、String型になるのは最後の変数だけで、その他の変数は型指定が省略されているのでVariant型になります。 dim a,b,c,d as string 個人的には変数の宣言は長ったらしくなっても、まとめない方が後で解りやすくて良いと思います。
補足
その情報は初めて知りました、、 気をつけます。 なるほど、確かにおっしゃるとおりですね! 今回するかどうかは別として宣言をまとめる方法としては有るのでしょうか?
- chie65536(@chie65535)
- ベストアンサー率44% (8757/19871)
文字列型の変数が沢山必要なら dim a,b,c,d,e,f,g,h,i,j,k,l as string と書けば、1行で宣言出来ます。 他にも dim a(100) as string って感じで配列にしてしまえば、一発で宣言できます。 元がa、b、cなどの1文字の変数名なら、配列にしちゃっても「判り難さ、難解度」は変わらないですからね。
補足
member,weekday,midnight 実際に使っているのはこのようなものなのですが、、、
- neKo_deux
- ベストアンサー率44% (5541/12319)
一般的には、配列を使います。 Dim x(9) Dim i for i=0 to 8 x(i)="○○" next i > 上記のような形でたくさん宣言しているのですが、 > 実際はもっとあり、 どう宣言してるか?より、その変数をどう使ってるんでしょう? 全く別個の意味や機能を持つ独立した変数として使ってるんなら、配列使っても冗長で意味の分からないソースになるかも知れません。 Dim x(3) x(0)=3 x(1)=2 x(2)=x(0)+x(1) Print x(2) と、 Dim a, b, c a=3 b=2 c=a+b Print c みたいな。
補足
おっしゃる通り実際は member,weekday,midnight といったような別々の独立したものです(・・;)
お礼
これいいですね! 多少ですが短くなりました!! ありがとうございました<m(__)m>