[[20190910230850]] 『記述の意味を教えてください(´;ω;`)』(イデコ) ページの最後に飛ぶ

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

 

『記述の意味を教えてください(´;ω;`)』(イデコ)

 ↓は前任者の作成していたマクロなのですが、本人が退職しており連絡が取れません。たぶん基本的なことばかりなのかな?とは思うのですが、調べようにもネットでどういうワードで検索すれば良いのかがわからず困っています。
恐縮ですが教えていただけると嬉しいです。

 顧客のデータベースが詰まった「データ」シートからこのマクロを走らせると、データの並び替えを行ってから「名簿」シートに飛びます。ただ今回問題にしているのは、挙動ではなくて記述そのものです。

 ※「データ」シートの顧客データは15行目から始まっています。「15」という数字が頻発するのはそのためです。

Sub 作成()

    Dim ST_CNT As Integer
    Dim RANGE_NM, RANGE_NM2, RANGE_KEY

    Sheets("名簿").Select

    Application.ScreenUpdating = False

' 最終行取得

    Sheets("データ").Select
    ActiveSheet.Unprotect
    ST_CNT = Range("C15").End(xlDown).Row

    RANGE_NM = "B15:AS" & ST_CNT
    RANGE_KEY = "AG15:AG" & ST_CNT
    Range(RANGE_NM).Select
    ActiveWorkbook.Worksheets("データ").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("データ").Sort.SortFields.Add Key:=Range(RANGE_KEY) _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortTextAsNumbers
    With ActiveWorkbook.Worksheets("データ").Sort
        .SetRange Range(RANGE_NM)
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

' Range("AH15") = COUNTIF($AG$15:AG15,AG15)

    Range("AH15").Select
    ActiveCell.FormulaR1C1 = "=COUNTIF(R15C33:RC[-1],RC[-1])"
    Range("AH15").Select

    RANGE_NM2 = "AH15:AH" & ST_CNT
    Selection.AutoFill Destination:=Range(RANGE_NM2), Type:=xlFillDefault
    Range(RANGE_NM2).Select

    Range("C11").Select

' シート保護(データ)

    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFiltering:=True

    Sheets("名簿").Select
    Range("B1").Select

End Sub

【ご質問】

1.変数を定義するのに「ST_CNT」とか「RANGE_NM」などという長い文字列を使っていますが、これは一般的なことなのでしょうか? それとも別に「i」とか「a」とかでも問題はないのでしょうか?

2.10行目、「RANGE_NM = "B15:AS" & ST_CNT」という記述の意味がよくわかりません・・・。「B15:AS15」ならわかるのですが、「B15:AS」で正しい記述なのですか?
 また、「"B15:AS" & ST_CNT」自体の意味もわからないです(´;ω;`) 上部に「ST_CNT = Range("C15").End(xlDown).Row」という記述があるため、今ST_CNTの値は「データ」シートのセルC15から下向きに数えて顧客データの終点までを見るので、例えば顧客データが100件であればどうなるのでしょう? 私の想像だと、B15〜AS114の範囲を意味する・・・のでしょうか?

3.もしそうであれば、仮に「データ」シートの列方向にもっと項目を増やしたとしても、現状の記述では「B〜AS」列までしかオートフィルタが機能せず。AT列より右側は並び替え時に取り残されてしまうことになるという解釈で正しいでしょうか?

4.27行目、「ActiveCell.FormulaR1C1 = "=COUNTIF(R15C33:RC[-1],RC[-1])"」という記述の意味がわからないです。「R1C1」とか「R15C33」は、セルの範囲を意味しているのでしょうか? 「RC[-1]」という表現も初めて目にしました(´;ω;`)

質問が多くて大変申し訳ありません。よろしくお願いします。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


 コードそのものは見ずにコメントしています。

 |1.変数を定義するのに「ST_CNT」とか「RANGE_NM」などという長い文字列を使っていますが、
 |    これは一般的なことなのでしょうか? それとも別に「i」とか「a」とかでも問題はないのでしょうか?

      変数名は内容がわかるようなものがいいですね。
      student_count , range_nameみたいな意味を込めているんでしょうかね。
      実行するだけなら i でもa でも動きますね。
      でもコードというのは、内容ができるだけ想像しやすいものにするのが普通です。
      単純な繰り返しに使うものは、i,j,k,l,m,m などが使われますね。

 |2.10行目、「RANGE_NM = "B15:AS" & ST_CNT」という記述の意味がよくわかりません・・・。
 |    「B15:AS15」ならわかるのですが、「B15:AS」で正しい記述なのですか?

      「B15:AS」で切らずに、"AS" & ST_CNT で意味が出てくるわけです。 AS列のST_CNT行目のセルですな。

 |    また、「"B15:AS" & ST_CNT」自体の意味もわからないです(´;ω;`)
 |     上部に「ST_CNT = Range("C15").End(xlDown).Row」という記述があるため、
 |     今ST_CNTの値は「データ」シートのセルC15から下向きに数えて顧客データの
 |     終点までを見るので、例えば顧客データが100件であればどうなるのでしょう?
 |     私の想像だと、B15〜AS114の範囲を意味する・・・のでしょうか?

      ST_CNTはC15セルから下にCtrl+↓でジャンプしたときの行番号です。
      100件あれば、B15〜AS114の範囲を意味する、ということだと思います。正しいと思います。

 |3.もしそうであれば、仮に「データ」シートの列方向にもっと項目を増やしたとしても、
 |    現状の記述では「B〜AS」列までしかオートフィルタが機能せず。
 |    AT列より右側は並び替え時に取り残されてしまうことになるという解釈で正しいでしょうか?

      そうなるでしょうね。

 |4.27行目、「ActiveCell.FormulaR1C1 = "=COUNTIF(R15C33:RC[-1],RC[-1])"」という記述の
 |    意味がわからないです。「R1C1」とか「R15C33」は、セルの範囲を意味しているのでしょうか?
 |   「RC[-1]」という表現も初めて目にしました(´;ω;`)

      いわゆるR1C1形式というセルの指定形式です。
      http://www.asahi-net.or.jp/~ef2o-inue/shiki/sub03_010_02.html
      これはセルに入れる数式ですから、そのルールを想い出してください。

(γ) 2019/09/11(水) 00:59


わかりやすくご説明いただき、ありがとうございます!
疑問が一気に氷解しました(〃^ー^〃)
(イデコ) 2019/09/11(水) 07:18

 ついでに、中身も読んでみました。
 わたしだったら、こんな風に書くかも。一例です。

 Sub 作成()
     Dim lastRow  As Long
     Dim lastCol  As Long
     Dim rngALL   As Range
     Dim rngName2 As Range
     Dim rngKey   As Range

     Application.ScreenUpdating = False

     With Sheets("データ")
         .Unprotect

         '最終行取得
         lastRow = .Range("C15").End(xlDown).Row
         lastCol = .Cells(15, .Columns.Count).End(xlToLeft).Column

         Set rngALL = .Range("B15", Cells(lastRow, lastCol)) ' 空白行空白列が無ければCurrentRegionも可
         Set rngKey = .Range("AG15:AG" & lastRow)

         'Key列(AG列)の昇順で全範囲をソート
         With .Sort
             .SortFields.Clear
             .SortFields.Add Key:=rngKey, _
                 SortOn:=xlSortOnValues, Order:=xlAscending, _
                 DataOption:=xlSortTextAsNumbers
             .SetRange rngALL
             .Header = xlGuess
             .MatchCase = False
             .Orientation = xlTopToBottom
             .SortMethod = xlPinYin
             .Apply
         End With

         'AG列の累計個数をAH列に設定(Range("AH15") = COUNTIF($AG$15:AG15,AG15))
         .Range("AH15").FormulaR1C1 = "=COUNTIF(R15C33:RC[-1],RC[-1])"
         Set rngName2 = .Range("AH15:AH" & lastRow)
         .Range("AH15").AutoFill Destination:=rngName2, Type:=xlFillDefault

         ' シート保護
         .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFiltering:=True
     End With

     Sheets("名簿").Select   '余りこうしたことはしませんが。
     Range("B1").Select
     Application.ScreenUpdating = True
 End Sub

(γ) 2019/09/11(水) 12:23


コメント返信:

[ 一覧(最新更新順) ]


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