エクセルVBAに関する質問です。お気持ちのみですが300P差し上げます。


コメント蘭に示す動作をするマクロを作って下さいませ。

回答の条件
  • 1人2回まで
  • 登録:2008/11/08 03:28:48
  • 終了:2008/11/08 14:16:23

ベストアンサー

id:taknt No.1

きゃづみぃ回答回数13539ベストアンサー獲得回数11982008/11/08 07:15:33

ポイント300pt

前提条件

階層 アドレス

は 一行目から始まるものとし

アドレスの列のセルの書式設定は、すべて文字列としておいてください。

テストとして

階層の最初の1がA1で

B1のセルを選択した状態から実行して 例になるように作ってあります。



Sub AutoAddress()
r = ActiveCell.Row
c = ActiveCell.Column

For a = r To 65536
    If Cells(a, c - 1).Value = "" Then Exit For
    d = Cells(a, c - 1)
    If Not IsNumeric(d) Then Exit For
    Level = d
    If a = 1 Then
       PreviousAddress = Right(r + 100, 2)
    Else
        d = Cells(a - 1, c - 1)
        If Level = d Then
            PreviousAddress = Cells(a - 1, c)
            e = Int(Right(PreviousAddress, 2))
            e = e + 1
            PreviousAddress = Left(PreviousAddress, Len(PreviousAddress) - 2) & Right(e + 100, 2)
        End If
        If Level - 1 = d Then PreviousAddress = Cells(a - 1, c) & ".01"
        If Level + 1 = d Then
            PreviousAddress = Cells(a - 1, c)
            PreviousAddress = Left(PreviousAddress, Len(PreviousAddress) - 3)
            e = Int(Right(PreviousAddress, 2))
            e = e + 1
            PreviousAddress = Left(PreviousAddress, Len(PreviousAddress) - 2) & Right(e + 100, 2)
        End If
    End If

    Cells(a, c) = PreviousAddress
Next a
End Sub
id:ReoReo7

ありがとうございます!

おかげさまで、かなり使いやすいVBAができました。

また、参考になる点が多々ありました。

2008/11/08 08:04:26
  • id:ReoReo7
    Sub AutoAddress()

    1:アドレスタイプ
    ●アドレスタイプは文字列だが、その記述型は階層により異なる

    階層(数字) アドレス記述型(文字列)
    1 2文字
    2 2文字.2文字
    3 2文字.2文字.2文字
    n 2文字.2文字.・・・.2文字 (n個)

    2:格納セル
    ●階層とアドレスが横に並んでいる。
    [例]
    階層 アドレス (●2列にデータが並んでいる。)
    1 01
    1 02
    1 03
    1 04
    2 04.01
    2 04.02
    1 05
    2 05.01
    2 05.02
    3 05.02.01
    3 05.02.02
    2 05.03
    1 06
    1 07

    3:動作
    以下のとおり。アクティブにしているセルより下のアドレスの自働記述。
    1:現在、あるセルがアクティブである。アクティブセルを「自身」と呼ぶ。
    2:自身の左のセルの値を参照し、整数ならば Level(整数型)に格納し Flag=True とする。無ければFlag=False。
    3:自身の左の列の、一つ上のセルを参照する。
    1)値がLevelなら、PreviousAddress (文字列型) = その右(自身の上)のセルの値。
    無ければ、
    2)値がLevel-1なら、PreviousAddress = その右(自身の上)のセルの値 & ".00" 。
    3)それ以外なら、Flag=False。
    4:そして、Right(PreviousAddress, 2)を数値に変換し、+1し、文字列にしたものをPreviousAddressの右二つの文字列と入れ替え、自身に格納する。
    5:自身の下のセルをアクティブにする。
    6: 2:~5:を繰り返す ループ条件=Flag

    同じ動作をするものであれば、変数の名前やアルゴリズムは変更してかまいません。


    4:テスト
    階層 アドレス
    1
    1
    1
    1
    2
    2
    1
    2
    2
    3
    3
    2
    1
    1
    でためし、2:と同じものができること。
  • id:ReoReo7
    すみません。動作の3:を間違っていました。以下が正しい動作です。

    Sub AutoAddress()

    1:アドレスタイプ
    ●アドレスタイプは文字列だが、その記述型は階層により異なる

    階層(数字) アドレス記述型(文字列)
    1 2文字
    2 2文字.2文字
    3 2文字.2文字.2文字
    n 2文字.2文字.・・・.2文字 (n個)

    2:格納セル
    ●階層とアドレスが横に並んでいる。
    [例]
    階層 アドレス (●2列にデータが並んでいる。)
    1 01
    1 02
    1 03
    1 04
    2 04.01
    2 04.02
    1 05
    2 05.01
    2 05.02
    3 05.02.01
    3 05.02.02
    2 05.03
    1 06
    1 07

    3:動作
    以下のとおり。アクティブにしているセルより下のアドレスの自働記述。
    1:現在、あるセルがアクティブである。アクティブセルを「自身」と呼ぶ。
    [ループ]
    2:自身の左のセルの値を参照し、整数ならば Level(整数型)に格納する。そうでなければループ脱出。
    3:自身の左の列の、一つ上のセルを参照する。自身がシートの上端なら、ループ脱出。
    1)値がLevelなら、PreviousAddress (文字列型) = その右(自身の上)のセルの値。
    無ければ、
    2)値がLevel-1なら、PreviousAddress = その右(自身の上)のセルの値 & ".00" 。
    *******ここを追加*******
    2-2)値がLevel+1なら、3:に戻る。
    ******追加ここまで*******
    3)それ以外なら、ループ脱出。
    4:そして、Right(PreviousAddress, 2)を数値に変換し、+1し、文字列にしたものをPreviousAddressの右二つの文字列と入れ替え、自身に格納する。
    5:自身の下のセルをアクティブにする。
    [ループここまで]

    同じ動作をするものであれば、変数の名前やアルゴリズムは変更してかまいません。
    (これで動くと思っていますが、間違っていたら適宜修正ください。)

    4:テスト
    階層 アドレス
    1
    1
    1
    1
    2
    2
    1
    2
    2
    3
    3
    2
    1
    1
    でためし、2:と同じものができること。
  • id:taknt
    4のテストの場合、最初の値をセットできないので 行から取得しました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません