質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • VBA

    1729questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

一般的なIF文?どれがお好みですか。または更なる結果セットの良い工夫方法はありますか?

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 352

King_of_Flies

score 296

タイトルの質問だけでは意図する意味が分からないと思うので
例を書きます。
①のプログラム

If A > B And C > D Then
  Call setMsg("ありがとう")
ElseIf A > B And C < D Then
  Call setMsg("ありがとう")
ElseIf A < B And C > D Then
  Call setMsg("ありがとう")
ElseIf A < B And C < D Then
  Call setMsg("thank you")
End If

例えばこんな分岐があったとして、
書き換える方法はいくらでもあると思うのですが、

書き換え1
②のプログラム

If A > B Then
  Call setMsg("ありがとう")
ElseIf C > D Then
  Call setMsg("ありがとう")
Else
  Call setMsg("thank you")
End If

書き換え2
③のプログラム

If (A > B And C > D) Or (A > B And C < D) Or (A < B And C > D) Then
  Call setMsg("ありがとう")
Else 
  Call setMsg("thank you")
End If

①は分岐パターンを4つすべてIfで描いたことで、
分岐の論理はわかりやすいですが、結果セットが同じものが複数できていて、
冗長的に思えますよね。

②は分岐パターンが多少工夫され、
パターンは減りましたが、結果セットは同じ組み合わせがあるし、
パターン網羅されているかどうかは、①に比べてわかりにくくなった気がしますよね?

③は確かに分岐パターンが二分化されていて、結果セットはそれぞれのパターンのみに集約されていますが、
If分の構成が長く見ずらい印象を持ちますよね。

こうなった場合、皆様はどんな工夫を凝らして、
スマートなコードを書いていますか。

教えてください。

回答をいただいたので例文追加で、説明を求めます。

Sub CellSetter()
        For i = 6 To rowsCount
            '作業着手予定日が空ならFor文から抜ける
            If Cells(i, 2).Value = "" Then
                Exit For
            End If
            'B6セルから末端までのデータを一時的に格納する。
            cellDateB = Cells(i, 2).Value
            'C6セルから末端までのデータを一時的に格納する。
            cellDateC = Cells(i, 3).Value
            'D6セルから末端までのデータを一時的に格納する。
            cellDataD = Cells(i, 4).Value
            '①
            If cellDateC < cellDateFrom Then
                Call Selecter(i, cellDataD, C_START, C_END, C_START, C_END_LATE, C_START_LATE, C_END_LATE)
            '②
            ElseIf cellDateB < cellDateFrom And cellDateC = cellDateTo Then
                Call Selecter(i, cellDataD, C_START, C_END, C_START, C_END_LATE, C_START_LATE, C_END_LATE)
            '③
            ElseIf cellDateB < cellDateFrom And cellDateFrom < cellDateC And cellDateC < cellDateTo Then
                Call Selecter(i, cellDataD, C_START, C_END, C_START, C_END_LATE, C_START_LATE, C_END_LATE)
            '④
            ElseIf cellDateFrom = cellDateB And cellDateFrom < cellDateC And cellDateC < cellDateTo Then
                Call Selecter(i, cellDataD, C_START, C_END, C_START, C_END_LATE, C_START_LATE, C_END_LATE)
            '⑤
            ElseIf cellDateFrom < cellDateB And cellDateB < cellDateTo And cellDateFrom < cellDateC And cellDateC < cellDateTo Then
                Call Selecter(i, cellDataD, C_START, C_END, C_START, C_END_LATE, C_START_LATE, C_END_LATE)
            '⑥
            ElseIf cellDateFrom < cellDateB And cellDateB < cellDateTo And cellDateC = cellDateTo Then
                Call Selecter(i, cellDataD, C_START, C_END, C_START, C_END_LATE, C_START_LATE, C_END_LATE)
            '⑦
            ElseIf cellDateFrom < cellDateB And cellDateB < cellDateTo And cellDateTo < cellDateC Then
                Call Selecter(i, cellDataD, C_START, C_END_FIRST, C_START, C_END_EMP, C_START_LATE, C_END_EMP)
            '⑧
            ElseIf cellDateB = cellDateTo And cellDateTo < cellDateC Then
                Call Selecter(i, cellDataD, C_START, C_END_FIRST, C_START, C_END_EMP, C_START_LATE, C_END_EMP)
            '⑨
            ElseIf cellDateTo < cellDateB Then
                Call Selecter(i, cellDataD, C_START_FIRST, C_END_FIRST, C_START_FIRST, C_END_EMP, C_START_EMP, C_END_EMP)
            '⑩
            ElseIf cellDateB < cellDateFrom And cellDateFrom = cellDateC Then
                Call Selecter(i, cellDataD, C_START, C_END, C_START, C_END_LATE, C_START_LATE, C_END_LATE)
            '⑪
            ElseIf cellDateB = cellDateFrom And cellDateC = cellDateTo Then
                Call Selecter(i, cellDataD, C_START, C_END, C_START, C_END_LATE, C_START_LATE, C_END_LATE)
            '⑫
            ElseIf cellDateB = cellDateFrom And cellDateTo < cellDateC Then
                Call Selecter(i, cellDataD, C_START, C_END_FIRST, C_START, C_END_EMP, C_START_LATE, C_END_EMP)
            '⑬
            ElseIf cellDateB < cellDateFrom And cellDateTo < cellDateC Then
                Call Selecter(i, cellDataD, C_START, C_END_FIRST, C_START, C_END_EMP, C_START_LATE, C_END_EMP)
            '⑭
            ElseIf cellDateB = cellDateFrom And cellDateC = cellDateFrom Then
                Call Selecter(i, cellDataD, C_START, C_END, C_START, C_END_LATE, C_START_LATE, C_END_LATE)
            '⑮
            ElseIf cellDateB = cellDateTo And cellDateC = cellDateTo Then
                Call Selecter(i, cellDataD, C_START, C_END, C_START, C_END_LATE, C_START_LATE, C_END_LATE)
            End If
        Next i
    End Sub

このプログラムで分岐結果が少ないのは⑨の一個ですが、

If cellDateTo < cellDateB Then
  '処理
ElseIf


とした後のElseIfの式はどうかきますか?

BA後のコメントに対してさらに改修したコード

    --セット条件に当てはまる引数をSetCellに渡す。
    --pRow = 対象行数
    --pClumn = 対象列数
    --pDuaringPattern = 期間パターン
    --pProgressSituation = 進捗状況
    Sub SetCells(pClumn As Integer)

        For pRow = 6 To rowsCount

            --対象セルのデータを格納する。
            pCellDate = Cells(pRow, pClumn).Value
            --対象セルのデータの存在チェック
            If Cells(pRow, pClumn).Value = "" Then
                Exit For
            End If

            --期間パターンを格納する変数。
            Dim pDuringPattern As Integer
            --期間パターンセット
            If pCellDate < cellDateFrom Then
                pDuringPattern = 0
            ElseIf pCellDate = cellDateFrom Then
                pDuringPattern = 1
            ElseIf cellDateFrom < pCellDate And pCellDate < cellDateTo Then
                pDuringPattern = 2
            ElseIf pCellDate = cellDateTo Then
                pDuringPattern = 3
            ElseIf cellDateTo < pCellDate Then
                pDuringPattern = 4
            End If

            --進捗状況を格納する変数
            Dim pProgressSituation As Integer
            --進捗状況セット
            cellDataD = Cells(pRow, 4).Value
            Select Case cellDataD
                Case 100
                     pProgressSituation = 0
                Case 0
                     pProgressSituation = 1
                Case 1 To 99
                     pProgressSituation = 2
            End Select

            --セルに文字をセットする処理
            Call SetCell(pRow, pClumn, pDuringPattern, pProgressSituation)

        Next pRow

    End Sub


    --対象セルへの文字列セット処理。
    --pString = セットする文字列
    --pClumn = 2:着手状態 3:完了状況
    --pProgressSituation = 0:進捗状況100% 1:進捗状況0% 2:進捗状況1~99%
    --pDuringPattern = 期間のパターン 4:報告期間未満
    Sub SetCell(pRow As Variant, pClumn As Integer, pDuringPattern As Integer, pProgressSituation As Integer)

        --対象セルにセットする文字を格納する変数
        Dim pString As String

        If pClumn = 2 Then
            If pDuringPattern = 4 Then
                Select Case pProgressSituation
                    Case 0, 2
                        pString = C_START_FIRST
                    Case 1
                        pString = C_START_EMP
                End Select
            Else
                Select Case pProgressSituation
                    Case 0, 2
                        pString = C_START
                    Case 1
                        pString = C_START_LATE
                End Select
            End If
        Else
            If pDuringPattern = 4 Then
                Select Case pProgressSituation
                    Case 0
                        pString = C_END_FIRST
                    Case 1, 2
                        pString = C_END_EMP
                End Select
            Else
                Select Case pProgressSituation
                    Case 0
                        pString = C_END
                    Case 1, 2
                        pString = C_END_LATE
                End Select
            End If
        End If

        --対象セルへの文字セット
        Cells(pRow, pClumn + 3).Value = pString
    End Sub
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • King_of_Flies

    2017/09/28 14:20

    全く変わりません。全網羅をIfで分岐させています。

    キャンセル

  • King_of_Flies

    2017/09/28 14:21

    例えば②と⑤を入れ替え、⑫と⑦を入れ替え、⑮と①を入れ替えても結果は変わりません。

    キャンセル

  • King_of_Flies

    2017/09/28 16:41

    皆様たくさんの回答ありがとうございました。BAは悩んだところがありますが、どうか許して下さい。

    キャンセル

回答 5

checkベストアンサー

+1

cellDateFrom,To,B,CをそれぞれF(rom),T(o),S(tart),E(nd)
If文の結果は三種類なのでSelX,Y,Zとしてます。

おそらく前提としてF<=T,S<=Eなんだろうなと思いつつ
Sと区間F-Tの関係
Eと区間F-Tの関係でif文をソートします。

If E < F Then
    SelX()
ElseIf S < F And F = E Then
    SelX()
ElseIf S < F And F < E And E < T Then
    SelX()
ElseIf S < F And E = T Then
    SelX()
ElseIf S < F And T < E Then
    SelY()

ElseIf S = F And E = F Then
    SelX()
ElseIf S = F And F < E And E < T Then
    SelX()
ElseIf S = F And E = T Then
    SelX()
ElseIf S = F And T < E Then
    SelY()

ElseIf F < S And S < T And E = T Then
    SelX()
ElseIf F < S And S < T And F < E And E < T Then
    SelX()
ElseIf F < S And S < T And T < E Then
    SelY()

ElseIf S = T And E = T Then
    SelX()
ElseIf S = T And T < E Then
    SelY()

ElseIf T < S Then
    SelZ()

これを見ると
T < Sだったら問答無用でSelZ()
そうではなくT < EだったらSelY()
残りがSelX()とわかります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/28 15:15

    時間をわざわざ掛けていただいてありがとうございます。
    Selecterを三種に分割する方法で処理分けをするのですね。

    確かに変更がしやすいです。

    キャンセル

  • 2017/09/28 15:21 編集

    というかもともとの要件を想像するに
    * 期間内、もしくは前に終わった
    * 期間が終わる前に着手したが、終わらなかった
    * 期間内に開始すらしなかった

    の3種類を判定するだけだったのでは?
    実際何がしたかったんですか?

    キャンセル

  • 2017/09/28 15:32

    つたないこのコードから、
    実装意図を読み取った慧眼恐れ入ります。

    分岐結果を見ると4種ありますので、その通りですが、
    要件の変更で下記追加の想定も考えられます。

    今更ながら定数の説明ですが、
    Const C_START_FIRST As String = "先行着手"
    Const C_START As String = "着手"
    Const C_START_LATE As String = "遅れ"
    Const C_START_EMP As String = ""

    Const C_END_FIRST As String = "先行完了"
    Const C_END As String = "完了"
    Const C_END_LATE As String = "遅れ"
    Const C_END_EMP As String = ""

    となっていますが、
    Startの遅れ種類を遅れ(未着手)、遅れ(着手)に分割する可能性や、
    Endの遅れ種類を遅れ(未完了)、遅れ(完了)とする可能性もあるかもしれないとのことでした。

    これによってセットするパターンがだいぶ変わる可能性もあったので、
    条件の分岐を書いた経緯はあります。

    キャンセル

  • 2017/09/28 15:36

    ↑で伝わりますでしょうか・・・?

    キャンセル

  • 2017/09/28 15:37

    だとすると
    そもそもStart種類の判定とEnd種類の判定は独立していますよね
    つまり、
    StartとFrom-Toの関係性と
    EndとFrom-Toの関係性を別々に求めて
    それら結果を統合すればよかったのでは?

    キャンセル

  • 2017/09/28 15:41

    あ・・・

    キャンセル

  • 2017/09/28 15:42

    すいません、動揺して、意味のない返答をしてしまいました。

    キャンセル

  • 2017/09/28 15:48

    ちなみに先行着手ならある程度の完了遅れは通常完了とみなすみたいな謎ルールが万が一生えてきても
    それは統合段階で例外的ケースとして盛り込めばいいだけです

    キャンセル

  • 2017/09/28 15:54 編集

    ありがとう///

    キャンセル

  • 2017/09/28 16:23

    改修後はこんな感じになりました。というのを追記しておきます

    キャンセル

  • 2017/09/28 17:01 編集

    もっというと着手の判定と完了の判定に差がないので
    From-Toに対してある日時が前、中、後かを判定する関数作ればもっと短くなりますね

    SetEとSetFにほとんど違いないですもんね。
    ECellSetterとFCellSetterにほとんど違いないですもんね。

    SetFの処理書くときSetEをコピペしませんでした?
    コピペできるということは共通点だらけということで
    メソッドにまとめられるはずです

    キャンセル

  • 2017/09/28 18:20

    ぐぬぬ、SetFとSetEのメソッドはまとめることができたので、コード修正した物に質問を編集しました。が、ECellSetterとFCellSetterの処理をどうまとめればよいのか、、詰まってしまいました。

    キャンセル

+1

パターンの少ない場合を真っ先に考えれば、スッキリします。

If A < B And C < D Then
  Call setMsg("thank you")
Else
  Call setMsg("ありがとう")
End If

(余談ですが、「A=B」や「C=D」の場合の処理が、書き方によって微妙に違ってきますので、そこは要注意です)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/28 14:51

    追記されたぐらいに条件が多くなった場合、分岐用の表を作って、それをなぞって処理する、というぐらいに、考え方を変えたほうがわかりやすくなると思います。

    キャンセル

+1

順列と組み合わせの話に近いかと思います。
結論いうと、仕様というか重みをおくのは何か?で決まると思います。

たとえば、2枚のコインの裏表の結果で処理を判定する場合、
(表・表)、(表・裏)、(裏・表)、(裏・裏)の4つの順列がありますが、
(裏・表)と(表・裏)は同じと考えれば3通りになります(組み合わせ)

で、結果セットに重きをおくならば③でよいと思いますが、パターン(ここでいう順列)が重要なら
すなおに①で書くものだと思います。

というのもパターンによって処理をあとから変更したい場合、もとのifのorを取るという
面倒なわりにろくな成果のでない作業が発生します。

もしパターンと結果セットが同じ意味合いとして動作させる仕様であれば、そもそもの分岐の組み合わせ
を網羅させる考え方が不要かと。

条件をきちんと正規化するのが、maisumakunの回答。
そもそも条件を関数化しなさいが、szk.さんの回答(私は、こちらが好み)

で、私のいう趣旨は、そもそもパターンが重要だったら、結果が同じだからって、まとめちゃダメでしょ。っていうことです。
「ありがとう」を特定のパターンだけ「まことにありがとう」にするような変更が想定されるなら、条件をまとめないほうがよい。コードが重複するのがイヤなら、実行部分のコードを関数化しておけばよいかと。

ところで、一般的に多分岐はif文を使わないものかと・・・
ご存知かもしれませんが、select caseで複数条件はカンマでつなげればよいです。
これなら変更あって直すのは楽かなぁ。

Select Case condition
    Case 0,1,3,5,7
         Call setMsg("ありがとう")
    Case 2,4,6,8
         Call setMsg("thank you")
End Select

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/28 15:13

    あ、結局conditionを判定するロジックは、あのif文書かなきゃか・・・

    キャンセル

  • 2017/09/28 15:20

    Caseで 0,1,3,5,7という書き方は理解しているのですが、
    つまり、こうなるんですよね。

    Select Case condition
    Case cellDateC < cellDateFrom, cellDateB < cellDateFrom And cellDateC = cellDateTo, cellDateB < cellDateFrom And cellDateFrom < cellDateC And cellDateC < cellDateTo,/////////
    Call setMsg("ありがとう")
    Case cellDateFrom < cellDateB And cellDateB < cellDateTo And cellDateTo < cellDateC , cellDateB = cellDateTo And cellDateTo < cellDateC

    Call setMsg("thank you")

    End Select


    適当に略してますが、これはちょっと私の心が折れそうです。

    キャンセル

  • 2017/09/28 15:31 編集

    ozwkさんのコメントにありますが、最初に3パターンのどれか判定すれば、そもそも15種類の
    分岐を網羅する必要ないのでは?あ、この書き方をどうするかの質問とかわらないのか・・・ぐるぐるまわってきた。

    キャンセル

  • 2017/09/28 15:33

    15:13への返答>
    そうですよね。↑に記述した通りのことが起こりますよね。

    キャンセル

  • 2017/09/28 15:38

    15:33への返答>
    分岐網羅の経緯をozwskさんへの回答に追記しました。

    キャンセル

0

醜い条件分岐は関数で外に出します。
関数内ではお好きなように。

if (isJP(A,B,C,D)) {
  System.out.printf("ありがとう");
} else if (isEN(A,B,C,D)) {
  System.out.printf("thank you");
}

あとご提示の3件ですが、
A,B,C,Dのいくつかが同じ時に
①のケースと②、③のケースの挙動が変わります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

スッキリした書き方で言えば下記でしょうか。

If A < B And C < D Then
  Call setMsg("thank you")
Else
  Call setMsg("ありがとう")
End If


但しこれだと可読性が悪い(どういった理由でその条件式なのかがわからない)ので、私ならこう書くと思います。

If A > B Then
  Call setMsg("ありがとう")
Else
  If C > D Then
    Call setMsg("ありがとう")
  Else
    Call setMsg("thank you")
  End If
End If

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    【VBA】入力をした順番通りに文字が反映されない

    現在業務で使うエクセルの表の分類・入力を楽にするために 「セルG12~G300orI12~I300のどれか一つに『携帯ショップスタッフor本社事務or審査事務』などの求人名を入力

  • 解決済

    マクロで条件分岐させる

    VBA  Aの条件で「大」を表示 AからBに条件が変化したときが「中」表示に変化させるVBAを考えています。 下記を参考に考えましたがうまく行きません。どのような方法がBESTがお

  • 解決済

    VBA高速化について

    20個のエクセルファイルを読み込み、特定のシートにあるテーブルから特定の値を探し出し、その右横にあるセルの値を取り出します。 集計用のエクセルのテーブルでも、同じ特定の値をテーブル

  • 解決済

    VBA 条件分岐 while文?

     VBAで背景色をつけたい。エクセルの範囲を指定せずに、複数の条件分岐を実現したい ここに質問の内容を詳しく書いてください。 かなり長文になると思いますが、色々試した結果、手詰まり

  • 解決済

    VBA マクロの自動実行

    B3の番号に値を入力し、マクロを実行するとメーカー・製品名が反映される。(G~Iのデータを反映。) B3に入力した際に、C6~E6を自動で反映されるようにしたい。 また、番号を

  • 解決済

    for毎に値を渡したい

    いつも勉強させて頂いております。 現在プログラムを勉強しており、引数や戻り値について学んでいます。 【実現したい処理】 ・function str2()のfor毎にstr2の値

  • 解決済

    VBA ワークシートイベント

    VBAのワークシートイベントを使用した値の転記を繰り返して行う、値をクリアした場合転記先の値もクリアする。 値の転記は、対象行に末尾から転記していく。対象行に値が入力されていた

  • 受付中

    VBAにて空白を含むRangeの並び替え

     前提・実現したいこと エクセルのマクロでTreeViewにて表示したい内容があるのですが、 ノードの順番を入れ替えるのにつまづいています。 添付画像の左側がDBよりRe

同じタグがついた質問を見る

  • VBA

    1729questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • トップ
  • VBAに関する質問
  • 一般的なIF文?どれがお好みですか。または更なる結果セットの良い工夫方法はありますか?