VBA練習問題
VBA100本ノック 48本目:配列と数値型

VBAを100本の練習問題で鍛えます
最終更新日:2021-01-13

VBA100本ノック 48本目:配列と数値型


配列内の数値型のみ整数部に切り捨てる問題です。
配列は1次元と2次元だけに対応します。


ツイッター連動企画です。
ツイートでの見やすさを考慮して、ブック・シート指定等を適宜省略しています。

VBAテスト用のサンプルデータはご自身でご用意ください。


出題

出題ツイートへのリンク

#VBA100本ノック 48本目
引数が1次元または2次元配列の場合、以下の処理を行いVariantで返すFunctionを作成。
xxx (v as Variant) As Variant
・数値型は整数部のみにする(1.5→1, -1.5→-1)
・数値型以外(文字列、日付、その他)はそのまま
※配列以外と3次元配列以上もそのまま返してください。


VBA作成タイム

この下に頂いた回答へのリンクと解説を掲載しています。
途中まででも良いので、できるだけ自分でVBAを書いてみましょう。


他の人の回答および解説を見て、書いたVBAを見直してみましょう。


頂いた回答

解説

配列の次元数の確認はVBAに機能がありません。
UBoundでエラーになる手前が次元数として判断するのが一般的です。
変数のデータ型を判定するには、
TypeNameまたはVarTypeを使います。

Function VBA100_48_01(v As Variant) As Variant
  Dim rtn: rtn = v
  
  Dim i As Long, j As Long
  Select Case getDimension(rtn)
    Case 1
      For i = LBound(rtn) To UBound(rtn)
        If numVar(rtn(i)) Then rtn(i) = Fix(rtn(i))
      Next
    Case 2
      For i = LBound(rtn, 1) To UBound(rtn, 1)
        For j = LBound(rtn, 2) To UBound(rtn, 2)
          If numVar(rtn(i, j)) Then rtn(i, j) = Fix(rtn(i, j))
        Next
      Next
  End Select
  VBA100_48_01 = rtn
End Function

Function numVar(v As Variant) As Boolean
  numVar = False
  Select Case TypeName(v)
    Case "Single", "Double", "Currency", "Decimal"
      numVar = True
  End Select
'  Select Case VarType(v)
'    Case vbSingle, vbDouble, vbCurrency, vbDecimal
'      numVar = True
'  End Select
End Function

Function getDimension(v As Variant) As Integer
  Dim tDim As Integer
  On Error Resume Next
  Do While Err.Number = 0
    getDimension = getDimension + 1
    tDim = UBound(v, getDimension)
  Loop
  getDimension = getDimension - 1
End Function


今回は、
配列の次元数、Variantとデータ型についての理解を深める問題でした。
補足はありません。
記事にはVBAを掲載しました。


補足

補足はありません。


サイト内関連ページ

第12回.変数宣言のDimとデータ型|VBA入門
マクロVBA入門者が、まず最初につまずくのが、このDimで変数を宣言することでしょう。変数とは、数値や文字列など(すなわちデータ)を一時的に格納する入れ物 と良く説明されますが、まずはこの考えで良いでしょう。この入れ物には、いろいろなタイプの入れ物があります。
第106回.Functionプロシージャー|VBA入門
プログラム(マクロVBA)内で特定の作業を実行し値を返すプロシージャです。これはつまり、Functionプロシージャで独自の関数をつくれるということです。Subプロシードャーとの違いは、値を返すか返さないかの違いです。
第107回.プロシージャーの引数|VBA入門
Subプロシージャー、Functionプロシージャーにおける、引数リストの指定について説明します。引数は、呼び出し先のプロシージャーに渡すデータを指定するものです。Callステートメントでプロシージャーを呼び出すときに指定する引数を、呼び出される側のプロシージャーで受け取る記述についてのマクロVBA記述の説明になり…
第111回.静的配列|VBA入門
マクロVBAを学習していくと必ず配列が出てきます。VBA記述自体は簡単なものですが、正しく理解せずに使っている場合も結構見受けられます。ここでは、配列の概要から入り、VBAでの記述方法を解説していきます。
第112回.動的配列(ReDim)|VBA入門
マクロVBAにおける配列の説明として最初に静的配列を解説しました。静的配列では要素数は宣言時点で決められていました。しかし、プログラミングをする上で、実行時点で要素数を決めたい場合や、実行途中で要素数を増減させたい場合が多く出てきます。
TypeName関数|VBA関数
TypeName関数は、引数で指定された変数に関する情報を文字列で返します。TypeName関数 TypeName(varname) varname 必ず指定します。ユーザー定義型の変数を除く、任意のバリアント型(Variant)の変数を指定します。
VarType関数|VBA関数
VarType関数は、引数に指定された変数の内部処理形式を表す整数型(Integer)の値を返します。VarType関数 VarType(varname) varname 必ず指定します。引数varnameには、ユーザー定義型の変数を除く、任意のバリアント型(Variant)の変数を指定します。




同じテーマ「VBA100本ノック」の記事

45本目:テーブルに列追加
46本目:名前定義に使える文字
47本目:Window操作
48本目:配列と数値型
49本目:条件付き書式の判定
50本目:トリボナッチ数列
51本目:シート一覧と印刷ページ数
52本目:複数シートの一括印刷
53本目:テーブルの扱いと年齢計算
54本目:シートのChangeイベント
55本目:他ブックのマクロを起動


新着記事NEW ・・・新着記事一覧を見る

還暦のVBA:VBAまでたどりつけるか… (2021-09-29)
VLOOKUPを使うことを基本としてシートを設計すべきか|エクセル雑感(2021-08-17)
コンピューターはブラックボックスで良い|エクセル雑感(2021-08-14)
小文字"abc"を大文字"ABC"に変換する方法|エクセル雑感(2021-08-13)
ADOでテキストデータを集計する|VBAサンプル集(2021-08-04)
VBA学習のお勧めコース|エクセル雑感(2021-08-01)
エクセル馬名ダービー|エクセル雑感(2021-07-21)
在庫を減らせ!毎日棚卸ししろ!|エクセル雑感(2021-07-05)
日付型と通貨型のValueとValue2について|エクセル雑感(2021-06-26)
DXってなんだ? ITと何が違うの?|エクセル雑感(2021-06-24)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.Excelショートカットキー一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.RangeとCellsの使い方|VBA入門
5.繰り返し処理(For Next)|VBA入門
6.マクロって何?VBAって何?|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
9.セルに文字を入れるとは(Range,Value)|VBA入門
10.並べ替え(Sort)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ