オーロラさんの勉強帳

IT企業勤務。データベース、Excel、Excel VBA、ネットワーク、LinuxなどIT関連のことを主に書いていきます。少しでもお役に立てたら幸いです。

【Excel VBA スタンダード】参照渡し(ByRef)と値渡し(ByVal)の分かりやすい使い方の解説 (試験対策)

本記事ではVBA エキスパート『Excel VBA スタンダード』の試験範囲でもある『参照渡し』『値渡し』の使い方について、分かりやすく解説します。

参照渡しと値渡しのポイント

  1. 参照渡しはByRef 、値渡しはByValReference(参照)のRef、Value(値)のValと覚えましょう〉
  2. 参照渡し(ByRef):呼び出し元から呼び出し先に参照渡しで引数(変数)を渡した場合、呼び出し先で引数の値を変更すると、呼び出し元の変数の値も変更されます。
  3. 値渡し(ByVal):呼び出し元から呼び出し先に値渡しで引数(値)を渡した場合、呼び出し先で引数を変更しても、呼び出し元の変数は変更されません。
  4. 参照渡しは呼び出し先で引数が変更されると呼び出し元の変数も変更されるが、値渡しは呼び出し先で引数が変更されても呼び出し元の変数は変更されない。
  5. 呼び出し先が参照渡しで受け取るのか、値渡しで受け取るのか、引数の定義が重要です。
  6. 引数の定義にByRef、ByValを指定しなかった(定義を省略した)場合は、ByRef(参照渡し)が指定されます。

参照渡しと値渡渡しの動作 (呼び出し先でExcel⇒Wordに変更した場合の呼び出し元の変数の状況)


画像の通り、呼び出し先の引数を変更した場合、参照渡しでは呼び出し元の変数も変更されます。値渡しでは呼び出し元の引数は変更されません



実際のコードで参照渡し値渡しの動作を見てみましょう。

参照渡しの動作を確認するVBAのサンプルコード

以下のコードではsampleRef1からsampleRef2を呼び出しています。
その際に変数bufを引数として渡しており、sampleRef2ではByRef(参照渡し)で受け取っています。

Sub sampleRef1()
    
    Dim buf As String
    buf = "Excel"
    Call sampleRef2(buf)
    MsgBox buf
    
End Sub
Sub sampleRef2(ByRef A As String)
    
    MsgBox A
    A = "Word"
    MsgBox A

End Sub

結果は以下の通りです。

1回目のMsgBox:Excel ※参照渡しで受け取った引数を表示
2回目のMsgBox:Word ※受け取った引数を変更して表示
3回目のMsgBox:Word ※参照渡しのため呼び出し元のbufも変更されている


値渡しの動作を確認するVBAのサンプルコード

以下のコードではsampleVal1からsampleVal2を呼び出しています。
その際に変数bufを引数として渡しており、sampleVal2ではByVal(値渡し)で受け取っています。

Sub sampleVal1()
    
    Dim buf As String
    buf = "Excel"
    Call sampleVal2(buf)
    MsgBox buf
    
End Sub
Sub sampleVal2(ByVal A As String)
    
    MsgBox A
    A = "Word"
    MsgBox A

End Sub

結果は以下の通りです。

1回目のMsgBox:Excel ※値渡しで受け取った引数を表示
2回目のMsgBox:Word ※受け取った引数を変更して表示
3回目のMsgBox:Excel ※値渡しのため呼び出し元のbufは変更されない


以上、参照渡しと値渡しの解説でした。
お読みいただきありがとうございました。

【Excel】COUNTIF関数の使い方 ~検索条件に一致するデータの件数を数える。データの存在確認、重複確認をする~

本記事ではExcelCOUNTIF関数の使用方法を説明します。

COUNTIF関数とは。COUNTIF関数の書式

COUNTIF関数とは、指定した範囲の中で検索条件に一致するデータの件数を数える関数です。(検索条件に一致するデータがなければ0を返します)
検索条件には、比較演算子やワイルドカードを使うことができます。
COUNTIF関数の書式は以下の通りです。

COUNTIF関数の書式
=COUNTIF(範囲, 検索条件)


以下画像では、COUNTIF関数を使って顧客名簿で男性の件数、女性の件数を求めています。
f:id:auroralights:20211204213613p:plain
男性の件数は「=COUNTIF($D$3:$D$11,"男")」、女性の件数は「=COUNTIF($D$3:$D$11,"女")」で求めています。
COUNTIF関数で、範囲「$D$3:$D$11」検索条件「男」もしくは「女」が何件あるかを求めています。


データの存在を確認する方法

COUNTIF関数でデータ群の中に検索対象のデータが存在するかどうかを確認することができます。

f:id:auroralights:20211204232654p:plain
上記画像では、D列の検索対象のデータが、範囲「B3:B33」の中に何件存在するかどうか確認しています。

以下数式はB3:B33のセル範囲の中にセルD3の『A100』が何件あるか存在るかを求めています。
=COUNTIF($B$3:$B$33,D3)


データの重複を確認する方法

COUNTIF関数でデータ群の中で重複しているデータを探すことができます。
f:id:auroralights:20211204233459p:plain
上記画像では、B3:B33の管理番号が何件あるかを調べて2件以上の値が返っていれば、データが重複していることを表しています。
範囲を絶対参照で固定し、検索対象を相対参照とすることで、固定した範囲「$B$3:$B$33」の中に検索対象が何件あるかを調べています。

以下数式は、B3の検索対象『A100』がセル範囲『B3:B33』の中で何件存在しているかを求めています。
=COUNTIF($B$3:$B$33,B3)
検索対象をB3、B4、B5・・・とすることで、セル範囲の中にそれぞれのデータが何件あるかを調べることができます。


ポイントは、数式をコピーして利用するので検索範囲を絶対参照、検索対象を相対参照とすることです。

COUNTIF関数の検索条件に『比較演算子』を使って件数を求める

COUNTIF関数の引数の『検索条件』には、以下の比較演算子を使うことができます。比較演算子を使用する場合は検索条件とあわせて『"(ダブルクォーテーション)』で囲みます。

比較演算子 説明 使用例
= 等しい "=10"
<> 等しくない "<>男"
より大きい ">19"
< より小さい "<20"
>= 以上 ">=20"
<= 以下 ”<=19"


以下画像ではCOUNTIF関数検索条件に『比較演算子』を使い件数を求めています。
f:id:auroralights:20211204221604p:plain

COUNTIF関数の検索条件に『=』を使った使用例

住所が兵庫県神戸市の顧客件数を以下数式で求めています。
=COUNTIF($F$3:$F$11,"=兵庫県神戸市")
※=を省略した「=COUNTIF($F$3:$F$11,"兵庫県神戸市")」でも結果は同じです。

COUNTIF関数の検索条件に『<>』を使った使用例

性別が男以外の顧客件数を以下数式で求めています。
=COUNTIF($D$3:$D$11,"<>男")

COUNTIF関数の検索条件に『>』を使った使用例

年齢が19歳より大きい顧客件数を以下数式で求めています。
=COUNTIF($E$3:$E$11,">19")

COUNTIF関数の検索条件に『<』を使った使用例

年齢が20歳より小さい顧客件数を以下数式で求めています。
=COUNTIF($E$3:$E$11,"<20")

COUNTIF関数の検索条件に『>=』を使った使用例

年齢が20歳以上の顧客件数を以下数式で求めています。
=COUNTIF($E$3:$E$11,">=20")

COUNTIF関数の検索条件に『<=』を使った使用例

年齢が19歳以下の顧客件数を以下数式で求めています。
=COUNTIF($E$3:$E$11,"<=19")


COUNTIF関数の検索条件に『ワイルドカード』を使って件数を求める

COUNTIF関数の引数の『検索条件』に以下のワイルドカードを使うことができます。ワイルドカードを使用する場合は検索条件とあわせて『"(ダブルクォーテーション)』で囲みます。


演算子 説明 検索条件の使用例
* 任意の文字列 "A*"
? 任意の1文字 "?田"


以下画像ではCOUNTIF関数検索条件に『ワイルドカード』を使い件数を求めています。
f:id:auroralights:20211204225804p:plain

COUNTIF関数の検索条件に『*』を使った使用例

顧客IDがAから始まる件数、顧客IDがBから始まる件数を以下数式で求めています。
=COUNTIF($C$3:$C$11,"A*")
=COUNTIF($C$3:$C$11,"B*")

Mailにdocomoを含む件数を以下数式で求めています。
=COUNTIF($G$3:$G$11,"*docomo*")
※上記の条件だとdocomo@ezweb.ne.jpも含まれるので、キャリアがdocomoのメールアドレスの件数を調べるためには、条件を「*@docomo*」や「*@docomo.ne.jp」とした方がいいですね。記事を書いているときには気が付きませんでした。

COUNTIF関数の検索条件に『?』を使った使用例

顧客名が「○田」のデータ件数を調べています。※○は任意の1文字のことです。
=COUNTIF($B$3:$B$11,"?田")


COUNTIF関数の使用方法について、紹介しました。
私はデータの存在確認、重複確認でよく使います。ぜひいろいろな使い方をマスターしてみてください。
お読みいただきありがとうございました。

【資格】ORACLE MASTER Bronze DBA 2019(1Z0-085-JPN) に合格。学習期間、学習方法、難易度など

ORACLE MASTER Bronze DBA 2019(1Z0-085-JPN)に合格しました。
ORACLE MASTER Bronze DBA 2019(1Z0-085-JPN)の学習期間、学習方法、難易度などを紹介します。

ORACLE DATABASE DBA Bronze 2019の資格概要

ORACLE DATABASE DBA Bronze 2019は、Oracle Databaseに関する基礎的な知識を証明する資格となります。

ORACLE社のサイトでは、ORACLE DATABASE DBA Bronze 2019について以下のように紹介されています。

Oracle Database のアーキテクチャや Oracle Database の構成に関する重要な用語を理解し、またデータベースの日常的な運用管理についての基本を理解していることを証明します。ITエンジニアとして必要な Oracle Database に関する基礎知識があることを証明します。

試験番号、受験料、試験時間、出題形式、出題数、合格ライン

2021年11月14日時点の情報になります。

試験番号 受験料(税込) 試験時間 出題形式 出題数 合格ライン
1Z0-085-JPN 32,340円 120分 選択問題 70問 65%以上


試験料など変更になることもあります。最新情報は以下Oracle Universityから確認できます。
Oracle University
https://education.oracle.com/ja/


学習期間

学習期間:8月上旬~11月上旬 約4カ月
試験:11月上旬

Oracle Databaseの初級の資格に4カ月ほど費やしました。時間をかけすぎてしまいましたね。
学習期間の感覚値としては、IT経験者で1~2カ月、IT未経験者で2~3カ月を目安に学習するといいかと思いました。

私が試験までに時間を要した理由は以下の通りです。

  • ORACLE MASTER Bronze 12c SQL基礎が手ごわかったので、DBAの試験に慎重になりすぎた
  • 試験料が高いので、確実に合格するために試験を先延ばしにした
  • 資格試験で活用している「Ping-t」に、旧バージョンの問題しかなく、ORACLE DATABASE DBA Bronze 2019の問題がなかったこと
  • 比較的最近に形態が変わった試験で、情報が少なく、参考書だけの学習で足りるのかどうかがわからず、不安であった
  • 実際にOracle LinuxにOracle19cの環境を構築して知識を身につけたかった(参考書の丸暗記だけではなく、実際に環境を構築するなどして、活かせる知識にしたかった)
  • 仕事が忙しく、試験の日程調整や学習時間の確保ができなかった

学習方法

合格するための学習方法ですが、実際に受験してみて『翔泳社 オラクルマスター教科書 Bronze DBA Database Fundamentals』だけの学習で十分だと感じました。
『翔泳社 オラクルマスター教科書 Bronze DBA Database Fundamentals』の内容を理解して、章末問題、模擬試験問題を90%以上正解できる状態なら合格できると思います。

ただし、受験前って不安があると思いますので、私がした学習方法を以下に記載します。

  • 『翔泳社 オラクルマスター教科書 Bronze DBA Database Fundamentals』を6周~7周しました。

  • 12cの試験対策ではありますが、日本オラクル株式会社マーケティング本部のYoutubeチャンネルで以下の動画を2回視聴しました。

www.youtube.com

  • Virtual BoxのOracleLinuxにOracle19cの環境を構築。OUIやDBCAなどを実際に試してみました。

難易度

試験を受けてみて、『かなり易しい』と感じました。(事前にかなり学習したこともありますが)
学習方法の部分でも触れましたが、『翔泳社 オラクルマスター教科書 Bronze DBA Database Fundamentals』をしっかりやっておけば、合格ラインの65%以上は達成できると思います。


試験結果

正答率:90%で合格。
試験時間は120分です。私は最初の30分で全問解き終わり、その後30分で全問の見直しをました。計60分で試験を終わりました。

f:id:auroralights:20211114143033p:plain


感想

資格取得に関する考え

資格試験に合格することも重要ですが、学習した内容を自分の知識として今後の業務に活用できることも目的としています。
学習期間がかなり長くなりましたが、仕事との兼ね合いや、Oracle19cの環境構築などいろいろ試すことができたので、知識はある程度定着できたかなと思います。

試験に合格することだけを目的とするのなら、1カ月で丸暗記でも合格できるかなと思います。

Oracle Databaseに関する知識

運用業務で毎日Oracle Databaseを使っていますが、すでに構築されたデータベースに対して作業をしているので、OUIでのソフトウェアのインストール、DBCAでのデータベースの作成など、知識が深まりました。


お読みいただきありがとうございました。


ORACLE MASTER Bronze DBA 2019(1Z0-085-JPN)の学習には、この参考書