2021年7月28日水曜日

たかがエクセル、されどエクセルであって、ルーティン作業で事務効率をアップするためには、マクロのコードが欠かせません ー 範囲指定(エクセルVBA)

サンプルコード実行結果
        
最近、職場が変わりまして、生産計画という現場部門の方へ異動になりました。
MRPシステムに直接タッチする仕事になったのですが、意外と帳表がたくさん。

基幹システムから細かな要求に対応する作表は土台無理で、そんな時は手作業。
ある程度、検索したデータをファイルに保存してから、エクセルで加工します。

一部は、グーグルスプレッドシートに置き換えていますが、やっぱりエクセル。
社内では、見栄えの良い体裁の表が必要だったりして、書式設定では秀逸だな。

グーグルは、クラウドのドライブと連携するメリットがありますが、それだけ。
CSVデータをエクセルで開いて加工するには、マクロが便利で一日の長がある。

しかも、プログラム言語としては、簡易的な割には便利で、機能も豊富なんだ。
なので、五十代になってからVBAを個人で習得した自分に、声が掛かりました。

移ってから間もないのですが、単発でも面倒な仕事の自動化を依頼される始末。
色々と頭をひねりますが、そんな時、基本中の基本、セル範囲指定が気になる。

ネットで検索すると一般公開のサイトは、Range(”A1:D5”)と素っ気ない。
確かに基本なのですが、実際にプログラムを書くと、こういう使い方はまれだ。

今回のプログラミングでも、指定する範囲は、読み込むデータ量で変わります。
検索コマンドの”Find”を使う時なんか、都度、変化する範囲をどう表現するか。

簡単な表現では、Range(”範囲”).Find("検索値”)で探すのは、ご存じの通り。
だけど、Range(”範囲”)の”範囲”部分を変数化するのは、意外に作業が難しい。

昔は、Range(Cells(1,1),Cells(3,3))のような指定をしていましたが、問題が。
それは、アクティブでないシートの範囲指定をして検索すると挙動がおかしい。

要するに検索してくれなかったりで、この際、””で囲んだセル範囲を変数化だ。
下記に、サンプルを挙げておきますので、使って見たい人は検討してください。

Sub Sumple()
Dim Strng As String, Clmn As String, LstRw As Long, LstClmn As Long

LstRw = Cells(Rows.Count, 1).End(xlUp).Row ’最も下の行番号
LstClmn = Cells(1, 1).End(xlToRight).Column ’最も右列の番号
Clmn = Replace(Cells(1, LstClmn).Address(True, False), "$1", "") ’列番号文字変換

Strng = ""  '範囲の文字列生成
Strng = Strng & "A1:"  '範囲の開始点。
Strng = Strng & Clmn
Strng = Strng & LstRw
Strng = Strng & ""

Range(Strng).Select ’生成範囲の選択
End Sub

というわけで、生数字を入れて範囲指定をする必要はなくなると、思いますな。
この範囲の文字列生成の方法は、ADO接続で複雑なSQL構文による検索式を設定する場合などにも有効に活用できますので、ぜひ使い道を検討してもらいたいと思うのでした。



いいねと思ったら、三つポチっとね!
にほんブログ村 スキースノボーブログへにほんブログ村 スキースノボーブログ スキーへにほんブログ村 旅行ブログ 旅日記・旅の思い出へ
にほんブログ村    にほんブログ村      にほんブログ村 



0 件のコメント:

コメントを投稿