有村日記

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

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


稼働日数を求める関数

2024-04-30 07:08:54 | EXCEL
1.土曜日と日曜日、および指定された祝日を除いた期間内の稼働日数を計算

書式: =NETWORKDAYS(開始日, 終了日, [祭日])
開始日: 稼働日を数え始める基準となる日付を指定(必須)。
終了日: 稼働日を求める期間の最終日の日付を指定(必須)。
祭日: 祝日や社内の休業日を指定(省略可能)。省略した場合は土曜日と日曜日のみを除外。
この関数は月初からの経過日数を求めるのに有益なもの。
  • NETWORKDAYS関数が開始日を含めたある期間内の稼働日の日数
  • WORKDAY関数を使うと開始日から指定した日数だけ加算/減算した稼働日の日付
2.ある特定日の属する月の営業日数を求める
  • 日付:月間営業日数を求める月のある1日であればいつ何日でも構わない。
  • 月末日:EOMONTH(日付,0)
  • 月初日:EOMONTH(日付,-1)+1 前月の月末日の翌日(月初日)
  • 祝日等休業日:範囲で指定 (例:$C$10:$C$13 あるいは、範囲名)

書式:=NETWORKDAYS(EOMONTH(日付,-1)+1,EOMONTH(日付,0),祝日等休業日)


土日・祝祭日を除く月間第一営業日を求める関数

2024-04-29 08:11:33 | EXCEL
Excelで土日、祝休日を除いた月初日または第一営業日を求める方法

=WORKDAY(DATE(年, 月, 0), 1, 祝日範囲)
(注)祝日範囲は祝日や休日が入力されているセル範囲

例:
セルA2に日付(2024/4/29)が入力されている場合、
=WORKDAY(DATE(YEAR(A2),MONTH(A2), 0), 1, 祝日範囲)
→戻り値(計算結果)は2024/4/1となる。

このような使い方もある。 対象日が営業日かを判定。

=WORKDAY(対象日付-1,1,祝日範囲)<>対象日付

TRUEでは休業日、FALSEでは営業日

(対象日付の前日の翌日が対象日付ではない休業日。

対象日付の前日の翌日が対象日付[土日祝日ではない]である営業日。)


*祝日範囲は総務省WEBサイト祝日一覧のほか、例えば、銀行法施行令の定める日、個別の休業日などを設定すること。なお、日付は、上から下に古い日付新しい日付となるようにする。


DATE関数について
参照:
https://support.microsoft.com/ja-jp/office/date-%E9%96%A2%E6%95%B0-e36c0c8c-4104-49da-ab83-82328b832349
引数【日】:必ず指定します。 1から31までの月の日を表す正または負の整数。
指定した月の最終日より大きい数値を引数【日】に指定すると、その月の最初の日に日引数を加えた日を指定したと見なされます。 たとえば、DATE(2008,1,35) は 2008 年2月4日を表すシリアル値を返します。

引数【日】に1より小さい数値を指定すると、指定した月の最初の日から、日引数の絶対値に1を加えた日数を減算した日を指定したと見なされます。 たとえば、DATE(2008,1,-15) は 2007 年 12 月 16 日を表すシリアル値を返します。