日付とシリアルナンバー

シリアルナンバーとは、日付を意味する数値。単なる数値。シリアルナンバーを求める関数は、2種類ある。

  1. Serial:引数に、年月日を数値で渡す。関数名、DateSerial、TimeSerial
  2. Value:引数に、日付の文字列を渡す。関数名、DateValue、TimeValue

Serialの例。年、月、日、時、分、秒からシリアルナンバー/連番を得る。以下は、イミディエイトウィンドウ。?から始まる行は入力している。「’」から始まる文字列はコメント(月末)

?vba.DateSerial(2018,1,1)
2018/01/01 
?vba.TimeSerial(1,5,2)
1:05:02
?dateserial(2020,4,1)-1    '月末
2020/03/31 

Valueの例。文字列からシリアルナンバー/連番を得る。

?vba.DateValue("2000年5月1日")
2000/05/01 
?datevalue("2000-3-4")
2000/03/04 
?datevalue("2000/3/4")
2000/03/04 
?vba.TimeValue("12時")
12:00:00 
?vba.CDbl(vba.TimeValue("12時"))
 0.5

見た目の変更(書式設定)をするVBAライブラリのFromat関数。

a=vba.DateSerial(2020,4,1)
?vba.Format(a,"aaa")
水
?format(a+7,"d/m(aaa)")
8/4(水)
?format(now,"yyyy/m/d h:m:s")
2018/10/10 23:0:28

ワークシート関数でも、日付に関する関数は同様にあるが、一部違う点がある。ワークシート関数には、DateSerialとTimeSerialが無い。引数はヒントが出るので覚える必要が無いが比較しておく。

ワークシートに日付を文字列として入れるとシリアルナンバーになって入る。表示形式が日付や時間でもデータの中身を確認する必要がある。セルに日付の文字列として「平成30年1月1日 10時50分」などと入れる場合は、セルの入力の先頭「’」を入れてから入力する。

カテゴリー: 3 習熟のためにイミディエイウィンドウを使う | コメントする

Z出力って?Rangeコレクションに慣れる

複数のセルの扱いは、 プロシージャ作りの基本です。Rangeコレクションを配列のように扱う?のです。メモリ上で隣り合わせに連続にあるんでおんなじようなもんです。開始番号が配列が0、コレクションは1というのが違う。

だから、Z入力の次はZ出力です。

Offsetを使ってRangeを配列?みたいに使いましょう。

Offset、For Eachに慣れましょうね。覚えましょう、学習しましょう。じゃなくて書いて実行してみましょう。

カテゴリー: 9 セルの中で使うユーザー定義関数の作成 <VBA> | コメントする

Z入力、Z軌道

表形式のデータでTABキーで横に移動して最後の列でEnterキーを押すと 下の行の左端に移動 する。Z軌道です。

テーブルに設定すると全部TABキーです。横の移動TABキー。最後の列でもTABキーで下の行の左端に移動する。Z軌道です。

VBAでも同じです。Range(“A1:C3”)の範囲の各RangeをFor Eachで処理でするとZ軌道です。

以下のコードは、複数のセルを処理する時の基本形です。

'セル範囲もZ軌道
Function aa(r As Range)
    Dim x As Range
    For Each x In r
        Debug.Print x.Address(0, 0)
    Next
End Function
'aa excel.application.InputBox(prompt:="セル指定",type:=8)   'Type:=8は名前付き引数を使っている

ExcelのInputBoxはセルを指定できる。VBAのInputBoxにはその機能は無い。

私はFor EachとDo Loopばかりかもしれません。そんな時にあるセルの範囲を処理する時はZ。Zです。これで何とかなります。

https://youtu.be/Ziwj2bfsDX4
カテゴリー: 9 セルの中で使うユーザー定義関数の作成 <VBA> | コメントする

myUniqe2

動的配列数式なるものが実現する前に配列とカスタム関数/自作関数に慣れておきましょう。

myUniqe関数を改造して、2列目に出現回数を入れるようにしました。

'ユニーク、一意のデータを1列目、出現回数を2列名に出力
Function myUniqe2(r As Range)
    Dim col As New Collection 'コレクションオブジェクト
    Dim colAll As New Collection
    Dim x
    For Each x In r '引数のRangeオブジェクトを個々にxに入れる
        colAll.Add VBA.CStr(x)
        On Error GoTo myErr 'エラーの罠
        col.Add VBA.CStr(x), VBA.CStr(x)
        On Error GoTo 0 'エラートラップのリセット
    Next
    ReDim ar(10000, 1)  'NA大作のため大きめの配列にした。1は0と1で2列
    Dim i As Integer, cnt As Integer
    Dim xx
    For Each x In col '一意なコレクション
        cnt = 0 '個数の初期化
        For Each xx In colAll '全データ
            If xx = x Then cnt = cnt + 1 '全データを順番にxxに入れてxと比較
        Next
        ar(i, 0) = x '値
        ar(i, 1) = cnt '個数
        i = i + 1
    Next
    myUniqe2 = ar
    Exit Function
myErr: 'ラベル:を付ける
    Resume Next
End Function
カテゴリー: 9 セルの中で使うユーザー定義関数の作成 <VBA> | コメントする

myUniqe関数と配列数式

重複なしの値を列で表示する配列を返す関数。重複なし、ユニーク、データベース用語では一意制約の一意でもある。

'ユニーク、一意のデータを1列に出力
Function myUniqe(r As Range)
    Dim col As New Collection
    Dim x
    For Each x In r
        On Error GoTo myErr
        col.Add x, VBA.CStr(x)
        On Error GoTo 0
    Next
    ReDim ar(1000, 0) 'NA大作のため大きめの配列にした
    Dim i As Integer
    For Each x In col
        ar(i, 0) = x
        i = i + 1
    Next
    myUniqe = ar
    Exit Function
myErr:
    Resume Next
End Function
'for each x in myUniqe(range("b4:b14")):?x:next 'イミディエイト実行用
https://youtu.be/eNRUHDhPWWI
カテゴリー: 9 セルの中で使うユーザー定義関数の作成 <VBA>, 10 Error処理 | コメントする