有村日記

日常感じたこと、気がついたこと、思ったことを記録

VBAでMATCH関数・DATE関数を使う

2024-05-31 04:39:37 | EXCEL
目的:日付列の中で、ある日(例えば今日)は何行目にあるかを求める。

ワークシートの中では以下のように式を設定する。
=MATCH(TODAY(),A:A,0)

VBAでMATCH関数・DATE関数を使うときの留意事項を記す。
WORKSHEETFUNCTION.MATCH(DATE,RANGE("A:A"),0)では
「実行時エラー'1004' 
WorksheetFunction クラスのMatchプロパティを取得できません。」とエラーになる。

Date関数をCLng関数で処理する必要があるので注意が必要。
WorksheetFunction.Match(CLng(Date), Range("A:A"), 0)



最終行番号・最終列番号を求める関数

2024-05-05 09:21:49 | EXCEL

A列の最終行番号を求める。

=MAX(IFERROR(MATCH(MAX(A:A)+1,A:A,1),0),IFERROR(MATCH("",A:A,-1),0))

注:途中未入力セルを含む[スペース(半角・全角)は入力データとして評価されるので注意]

1行目の最終列番号を求める。

=MAX(IFERROR(MATCH(MAX(1:1)+1,1:1,1),0),IFERROR(MATCH("",1:1,-1),0))

注:途中未入力セルを含む[スペース(半角・全角)は入力データとして評価されるので注意]

下記を参照しました。感謝!


数式を文字列で取得する関数

2024-05-05 08:43:29 | EXCEL
=FORMULATEXT(参照)
参照する数式を文字列として返す機能(数式でない場合、エラーを返す)

この関数の有益な活用方を見出したので記録しておく。
  1. 作業用のワークフォルダに1日から月末までのフォルダーがあり、それぞれの日付フォルダーには同名のエクセルファイルが格納されている。
  2. はじめに一日のファイルで指定範囲をコピーし、一つにまとめるファイルにリンク貼り付けする。一つにまとめるファイルにリンク貼り付けした直後は相対参照になっているためvbaで絶対参照に変換する。(下記注書き)
  3. 一つにまとめるファイルにリンク貼り付けし、絶対参照に変換したのちその範囲をコピーし下の行に貼り付ける。貼り付けたのち日付を次の日付に全変換する。これをすべての日数分繰り返す。
  4. フォルダーの名前は日付形式になっているためセルの計算式を確認すると日付のデータがリンク式に入っていることがわかる。
  5. ここでFORMULATEXT関数を活かして、それぞれの行の日付を取得する。これにより日別の各種数値が統計できるようになる。
追記1:今回初めての試みであったが、1日より31日までの雛形を準備しておく。月が変わった場合リンク式の年月の部分のみを一斉置換することにより作業は大幅に簡略化される。

追記2:日付(文字列)を取得する際に、DATEVALUE関数を使う。
 書式:DATEVALUE(日付文字列)

(注)モノクロの彩り ←ありがとうございます。
https://tack.life/blog/copy-paste-vba-excel-reference/
 Private Sub 相対参照→絶対参照に変換()

With Selection
.Formula = Application.ConvertFormula(Formula:=.Formula, FromReferenceStyle:=xlA1, ToAbsolute:=xlAbsolute)
 End With

 End Sub