[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『記述の意味を教えてください(´;ω;`)』(イデコ)
↓は前任者の作成していたマクロなのですが、本人が退職しており連絡が取れません。たぶん基本的なことばかりなのかな?とは思うのですが、調べようにもネットでどういうワードで検索すれば良いのかがわからず困っています。
恐縮ですが教えていただけると嬉しいです。
顧客のデータベースが詰まった「データ」シートからこのマクロを走らせると、データの並び替えを行ってから「名簿」シートに飛びます。ただ今回問題にしているのは、挙動ではなくて記述そのものです。
※「データ」シートの顧客データは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
ついでに、中身も読んでみました。 わたしだったら、こんな風に書くかも。一例です。
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.