[[20161122155048]] 『行範囲が変動する場合の範囲指定と変数宣言』(はんりん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『行範囲が変動する場合の範囲指定と変数宣言』(はんりん)

集計データの日付エラーが無いか確認するためのマクロを作ろうとしています。

最終行にあります”Selection.AutoFill Destination:=Range("AB5:AC1000")”
の"AB5:AC1000"の部分を"AA"の表示されているデータに合わせて範囲指定したいのですが集計日によって行範囲が変動する場合の範囲指定方法を教えて頂けないでしょうか。
"AB""AC"の列は空白行となっております。

変数の宣言方法につきましてもご教示頂けませんでしょうか。
宜しくお願いします。

Sub 搬出日チェック()

    Columns("B:B").Select
    Selection.EntireColumn.Hidden = True
    Columns("D:X").Select
    Selection.EntireColumn.Hidden = True
    Columns("Y:Y").EntireColumn.AutoFit
    Range("AB4").FormulaR1C1 = "搬入日-搬出日"
    Range("AC4").FormulaR1C1 = "許可日-搬出日"

    Range("AB5").FormulaR1C1 = _
        "=IF(RC[-27]="""","""",IF(RC[-27]-RC[-25]<=0,""O.K."",""搬出日エラー""))"

    Range("AC5").FormulaR1C1 = _
        "=IF(RC[-28]="""","""",IF(RC[-3]-RC[-26]<=0,""O.K."",""搬出日エラー""))"
    Range("AB5:AC5").Select
    Selection.FormatConditions.Add Type:=xlTextString, String:="搬出日エラー", _
        TextOperator:=xlContains
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Font
        .Color = -16383844
        .TintAndShade = 0
    End With
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 13551615
        .TintAndShade = 0
    End With
    Columns("AB:AC").EntireColumn.AutoFit
    Selection.FormatConditions(1).StopIfTrue = False
    Selection.AutoFill Destination:=Range("AB5:AC1000")

End Sub

< 使用 Excel:Excel2010、使用 OS:Windows7 >


こんにちは

纏めると、

Sub 搬出日チェック()

    Columns("B:B").EntireColumn.Hidden = True
    Columns("D:X").EntireColumn.Hidden = True
    Columns("Y:Y").EntireColumn.AutoFit
    Range("AB4").FormulaR1C1 = "搬入日-搬出日"
    Range("AC4").FormulaR1C1 = "許可日-搬出日"

    With Range("AA5", Range("AA" & Rows.Count).End(xlUp))
        .Offset(, 1).FormulaR1C1 = _
            "=IF(RC[-27]="""","""",IF(RC[-27]-RC[-25]<=0,""O.K."",""搬出日エラー""))"
        .Offset(, 2).FormulaR1C1 = _
        "=IF(RC[-28]="""","""",IF(RC[-3]-RC[-26]<=0,""O.K."",""搬出日エラー""))"

        With .Offset(, 1).Resize(, 2)
            .FormatConditions.Add Type:=xlTextString, String:="搬出日エラー", _
                TextOperator:=xlContains
            .FormatConditions(.FormatConditions.Count).SetFirstPriority
            With .FormatConditions(1).Font
                .Color = -16383844
                .TintAndShade = 0
            End With
            With .FormatConditions(1).Interior
                .PatternColorIndex = xlAutomatic
                .Color = 13551615
                .TintAndShade = 0
            End With
            .EntireColumn.AutoFit
            .FormatConditions(1).StopIfTrue = False
        End With
    End With
End Sub

こんな感じになります。

(ウッシ) 2016/11/22(火) 16:29


ども^^

僕が書いたらこんな感じです。
参考になれば。。。

Sub 搬出日チェック()

    Dim Rng As Range    '操作対象セル範囲

    Columns("B").EntireColumn.Hidden = True
    Columns("D:X").EntireColumn.Hidden = True
    Columns("Y").EntireColumn.AutoFit

    Set Rng = Range(Range("AA5"), Cells(Rows.Count, "AA").End(xlUp))
    Set Rng = Rng.Resize(, 2).Offset(, 1)

    With Rng
        .EntireColumn.ClearContents
        .Cells(0, 1).Value = "搬入日-搬出日"
        .Cells(0, 2).Value = "許可日-搬出日"
        .Columns(1).Formula = "=IF(A5="""","""",IF(A5-C5<=0,""O.K."",""搬出日エラー""))"
        .Columns(2).Formula = "=IF(A5="""","""",IF(Z5-C5<=0,""O.K."",""搬出日エラー""))"

        .Worksheet.Cells.FormatConditions.Delete
        .FormatConditions.Add Type:=xlTextString, _
                              String:="搬出日エラー", _
                              TextOperator:=xlContains
        With .FormatConditions(1)
            .Font.Color = -16383844
            .Interior.Color = 13551615
        End With
        .EntireColumn.AutoFit
    End With
End Sub
(まっつわん) 2016/11/22(火) 16:49

まっつわん様

ご教示ありがとうございます。
Dim Rng As Range '操作対象セル範囲・・・を宣言すれば宜しいのですか。

変数の宣言方法が何を対象とすれば良いのか?理解できずに困っております。
変数ですから入れ物に入れる対象物なのでしょうが…それが??の状態で。

ありがとうございます。

(はんりん) 2016/11/22(火) 17:09


>変数の宣言方法が何を対象とすれば良いのか?理解できずに困っております。
>変数ですから入れ物に入れる対象物なのでしょうが…それが??の状態で。

操作するのはセルですから、
セル自体を対象にします。
Excel VBAでは特にRangeオブジェクトと呼ばれます。

変数には値だけではなく、オブジェクトと呼ばれるもの(セル、シート、ブック等)も代入できます。

宣言としては

Dim 変数名 as Range

              ~~~~~
                ↑ここで変数の型をRangeオブジェクトとする。

対して、変数にオブジェクトを代入するときは
set 変数名 = Range("A1")
~~~
↑Setステートメントを明示します。

(まっつわん) 2016/11/22(火) 17:18


A1セルと言っても、
値だけでなく、文字の大きさや塗りつぶしの色、
また条件付き書式設定など様々な設定も含んでA1セルが構成されています。
それらすべてがA1セルであり、そういう属性の集合体で構成されるものをオブジェクトと呼びます。

ちょっと難しい概念ですが、ぜひ理解してください
(まっつわん) 2016/11/22(火) 17:26


まっつわん様

丁寧なご教示ありがとうございます。
概念・・・頭の固い私には大変難しそうですが参考書を見ながら理解につとめたいと思います。
ありがとうございます。

(はんりん) 2016/11/22(火) 17:30


ウッシ様

ご教示ありがとうございます。
Offsetの使い方以前この質問箱でご教示頂いたのですが応用の仕方が理解できていませんでした。

先程から、ウッシ様へのお礼コメントが3回ほど続けて反映されておりませんでした。
申し訳ございません。
(はんりん) 2016/11/22(火) 17:34


 >>AB5:AC1000"の部分を"AA"の表示されているデータに合わせて範囲指定したいのですが

 この部分のみでいえば、
 Selection.AutoFill Destination:=Range("AB5:AC1000")

 この "AB5:AC1000" を "AB5:ACなんとか" にするわけですね。
 VBAの記述としては "AB5:AC" & なんとか になります。 じゃぁ、なんとか はどう記述するか。
 AA 列のデータ最終セルの行番号 ということですね。
 これは Range("AA" & Rows.Count).End(xlup).Row で求めることができます。

 ですから、合成すれば

 Selection.AutoFill Destination:=Range("AB5:AC" & Range("AA" & Rows.Count).End(xlup).Row)

 こんな書き方をしてもOKですね。

(β) 2016/11/22(火) 17:36


β様

範囲指定の方法ご教示ありがとうございます。
以前にもご教示頂いたのですが、中々応用する理解力が乏しく。
大変助かります。ありがとうございます。
(はんりん) 2016/11/22(火) 17:40


>概念・・・頭の固い私には大変難しそうですが参考書を見ながら理解につとめたいと思います。

http://www.itmedia.co.jp/im/articles/0703/06/news125.html

視覚的に確認するには、
僕のサンプルをステップインで実行し、

  Set Rng = Rng.Resize(, 2).Offset(, 1)

の行を実行した後、ローカルウィンドウで
Rngの左の「+」をクリックすると、何が代入されたか確認出来ます。
そこに入っているものが、Rangeオブジェクトの一部です。(見れないものもあります。)

(まっつわん) 2016/11/22(火) 18:22


まっつわん様

5分で絶対に分かるオブジェクト指向少し拝見しました。
これから、じっくりと読ませて頂きます。

ローカルウィンドウの使用方法ご教示ありがとうございます。
「+」をクリックしてみましたが、目が点になりました。
何がどうなっているのか?
オブジェクト指向を理解するのは大変なんですね。
牛歩以下の歩みとなりますが読んでまいります。
これからも、宜しくお願いします。

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

(はんりん) 2016/11/24(木) 15:23


>「+」をクリックしてみましたが、目が点になりました。
>何がどうなっているのか?
何がどうなってるかというより全部入っているのです。

なのでその中から、
フォントの名前を知りたければ、
Fontを探して、また左の+をクリックして、
表示されたNameのところを見ればいいわけです。

それを見る作業をコードで書くと、
Sub test()

    Dim Rng As Range

    Set Rng = Range("A1")

    MsgBox Rng.Font.Name
End Sub

となります。

(まっつわん) 2016/11/24(木) 16:01


まっつわん様

ローカリエリアでの確認何となく
メッセージボックスへの指示がフォントネームなら
Font→Name→MS Pゴシックへと導き出される訳ですね。

この部分だけですが何となく、おぼろげながら分かったような分かっていないと
思いますが、この先の展開をどうすれば良いのか先程ご教示いただきましたオブジェクト指向
をじっくりと読み進めます。

ありがとうございます。
(はんりん) 2016/11/24(木) 16:21


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.