ホチキス先生の「プログラマーと呼ばれたい」

InfoPath & SQL Server !

Archive for the ‘VBA’ Category

プログラミングせずにプログラミング思考が身に着くはずがない – 「プログラミング思考」という言葉のまやかし – Visual Studio を使った C# プログラミングは最高の学習環境である。

leave a comment »

「情報教育」や「プログラミング教育」という言葉が表に出るたびに本質からそれる言葉が作り出される。その理由は明らかだ。コンピュータのことを知らない人間が「情報教育」を語るとき「情報教育はコンピュータを教えるものではない」と言い、プログラミングを知らない人間が「プログラミングができなくてもプログラミング思考を身に着けることができる」と言う。この二つの理由の根は同じだ。

たとえばこのように言ってみよう。「英語で話ができなくても英語的思考を身に着けることができる」「足し算引き算ができなくても数学的思考を身に着けることができる」「電池を豆電球につなぎ光らせることができなくても理科的思考を身に着けることができる」「楽器を何も弾くことができなくても音楽的思考を身に着けることができる」

もうこれでいいだろう。

つまり、「プログラミングする」ということは「プログラミング思考」を養うための重要な学習プロセスであり、また「プログラミングができる」ことによって「プログラミング思考が身についた」ことを評価することができるのだ。

しかし、このことは当然、実用的なアプリケーションを完成させるまでのプログラミング力を養う必要はない、ということも真実である。またどのような言語を使うかも、学習者のレベルにあわせて選択すべきであろう。学習ツールとしてのプラットフォームも同様だ。

小学生ならブロック型のプログラミング言語を使うことがいいだろう。そしてブロックの背後にはコードがあることを体験させる。中学生程度なら多くの学校で実践されているエクセルのマクロ、VBA を使うのもいいだろう。厳密に言えばエクセルのマクロはプログラミングではなく、エクセルというアプリケーションソフトの「オートメーション」だ。しかしエクセルのマクロには学習者にとってたいへん有効な、マクロの自動記録の機能がある。マクロの記録をしながら画面を操作すると、操作の手順がマクロとして記録される。このコードを元にして応用、発展させることで、マクロの自学自習ができる。

高校生では本格的なプログラミングを学習させるべきだ。高校生には実際に社会で使われているアプリケーションやプラットフォームを使って実習をさせるべきである。筆者は20年も前に高等学校でマルチメディアデザインの授業を始めたが、当時いくつかあった安価な画像編集ソフトを使わず、Adobe の Photoshop を使った。

新しい技術の概念はツールに表現されている。適切なツールを使うことで新しい技術概念を正しく身に着けることができる。技術とツールは不可分である。

どの言語を使ってプログラミング教育をしていい。とならば、Visual Studio を使った C# プログラミングは大きな選択肢の一つである以上に、コンピュータの OS が Windows であるならば、最も開発環境を整えやすく、実社会で使われており、効率よく、単純なものから高機能なものまで作ることができ、データベースやネットワークの実習ができるアプリケーションも簡単に作ることができ、しかも書店に行けば初心者から上級者まで様々な解説書が手に入る、Visual Studio と C# の組み合わせは最高の選択肢だといえる。

2018年10月10日

松本 吉生(まつもとよしお)
Microsoft MVP Data Platform

1961年京都に生まれ、神戸で幼少期を過ごす。大学で応用化学を学んだのち、理科教諭として高等学校に勤務する。教育の情報化が進む中で校内ネットワークの構築運用に従事し、兵庫県立明石高等学校で文部科学省の「光ファイバー網による学校ネットワーク活用方法研究開発事業」に携わる。兵庫県立西宮香風高等学校では多部制単位制の複雑な教育システムを管理する学籍管理データベースシステムをSQL ServerとInfoPath、AccessなどのOfficeソフトウエアによるOBA開発で構築・運用する。2015年から2017年まで兵庫県立神戸工業高等学校でC#プログラミング、IoTなどのコンピュータ教育を行い、現在は兵庫県立神戸甲北高等学校に勤務する。2004年からマイクロソフトMVP(Microsoft Most Valuable Professional)を受賞し、現在15回目の連続受賞。2016年にマイクロソフト認定教育者(Microsoft Innovative Educator Experts : MIEE)を受賞し、現在4回目の連続受賞。

マイクロソフトは世界中の人々をみなプログラマーにする。プログラミング革命。世界が変わる。

leave a comment »

このタイトルを見て、同意できない人もいるだろう。テクノロジーやプログラミングに習熟している人ほどそう思うかもしれない。しかし間違いなくプログラミングは身近なものになっており、その速度は加速度を増している。そしてこのことが、世界を大きく変えるに違いない。そしてそれはもはや始まっている。

思い出してみよう。私の世代はコンピュータの誕生とともに歩んできたといえる。中学生のとき、私は初めてコンピュータに出会った。それは当時「マイコン」と呼ばれることが通常で、今から比べると貧弱で扱いにくく弱弱しいものだった。しかし私はそのコンピュータに出会ったとき、生まれて初めてのBASICプログラミングを夢中でやり、気が付けば空が明るくなり朝を迎えたという経験をした。

高校生の頃、ウォークマンが世の中に出た。それはカセットテープを使った持ち運びのできる、しかしスピーカーを持たない、イヤホンで自分だけが聴くためのマシンだった。ロックに目覚めた私はウォークマンの初代機を買い、ヘッドフォンをつけて町に出て音楽を聴いた。両親は嘆いた。そんなおかしな恰好をして外に出るな、と。だが今はどうだ。誰もが町で自分だけの音楽を聴いている。

大学生の頃、ようやく実用的なパソコンが庶民にも使える時代になった。就職したとき、勤務先の学校には NEC の 9800 シリーズのマシンがあった。しかしそれは予算がついて購入されたものの、誰も使える人はいなかった。使おうと考える人もいなかった。そこで私は Multiplan の表計算ソフトで成績処理のコンピュータ処理をはじめた。当時パソコンで表計算をすることは、特別な技能を持った人間のすることだった。

就職してしばらくし、ノートパソコンを買った。それは今のように軽量で小型のものではなく、バッテリーの持ちも極めて悪かったが、うれしくて毎日持ち歩き電車の中で物を書いたりした。周囲から奇異な目で見られた。あの人は何をやっているのだ、といったかんじだ。会議でもノートパソコンを使い始めた。ある教育セミナーに出席したとき、講演をノートパソコンでメモしていると隣の席の人から「キーボードの音がうるさいのでやめてくれ」と言われた。ノートパソコンを持ち歩き外出先で何かする、ということは変人のすることだった。今ではどうか。誰もがノートパソコンやタブレット、スマートフォンを外出先で使っている。

ウォークマンで外出先で音楽を聴いたり、表計算ソフトを使ったりモバイルデバイスを使うことは、最初はマニアックな変人のすることであったかもしれない。しかしそれが便利なものなら、必ず真似をする人が出てきて、そのうちに当たり前のことになってくる。プログラミングはどうか。確かにプログラミングは敷居が高い。しかし今では、デスクワーカーのほとんどが Excel の表計算ソフトウエアを使い、多くの人がマクロプログラミングをやっている。なぜか。マクロを使うと定型業務あ楽になるからだ。それがわかると人はマクロを学ぼうとする。マクロを教えるセミナーもある。

Excel でマクロを組めるようになれば、もはや一般のプログラミングも、ほんの目の前にある。Microsoft Visual Studio のようなプログラミングツールは革命的に進化し、とても簡単にプログラミングができる時代になっている。誰もが自分に必要な、仕事上の、家庭の、ホビーでのプログラミングをカジュアルにする時代になるだろう。それは、自動車の運転のように私たちの生活に浸透するだろう。今でも車の運転をしない人がいるが、ほとんどの人が運転免許を取得し、マイカーを運転して買い物へ、職場へ、旅行に行く。それと同様のことがコンピュータやプログラミングの世界でおこるに違いない。

(・・・続く)

yocface_MVP_SQLserver_936_936.png

2012年12月29日(土)、「第9回アドミンティーチャーズ勉強会(大阪)~それで使ってるつもりですか?Microsoft Office、Microsoft MVPが正しいOfficeの使い方を伝えます~」のご案内

leave a comment »

年末のあわただしい折ではあるが、2012年12月29日(土)に表記の勉強会を開催することにした。この勉強会では、Excel、Word、PowerPoint、の著名なMicrosoft MVPの方々にお話をいただく。不肖私はInfoPathやSQL Serverについてのお話をさせていただく。

4人のMVPでテーマを相談したとき、いくつかの案があった。それは、たとえば「誰も教えてくれなかった、Officeソフトの使い方」、「知って得するOfficeの作法」、「あなたの知らないOffice」といったものだった。とにかくこの4人のMVPはOfficeが大好きで日々仕事や日常生活の中で使いこなしている方々だ。特にExcelの田中さんは数々の著書もある有名な方で、きっとセッションの中で役に立つことをたくさんお話しいただけると思う。休憩時間での質問も大歓迎だ。

いろいろと忙しい年末だと思うが、ぜひ多くの方に来ていただきたい。懇親会もあります。

参加は、アドミンティーチャーズWebサイトから電子メールで申し込みを。

http://adminteachers.wordpress.com/2012/12/07/%e7%ac%ac%ef%bc%99%e5%9b%9e%e3%82%a2%e3%83%89%e3%83%9f%e3%83%b3%e3%83%86%e3%82%a3%e3%83%bc%e3%83%81%e3%83%a3%e3%83%bc%e3%82%ba%e5%8b%89%e5%bc%b7%e4%bc%9a%ef%bc%88%e5%a4%a7%e9%98%aa%ef%bc%89%ef%bd%9e/

アドミンティーチャーズWebトップページ

http://adminteachers.wordpress.com/

Access – DoCmd.OpenReportを利用してフォームのテキストボックスに絞り込み条件を入力してレポートを開くには

with one comment

(追記)2020.09.28
————————————————————————————————–
この記事で紹介している DoCmd.OpenReport メソッドについては、次のマイクロソフトの Docs.com を参照すればよいだろう。
Microsoft Docs.com「DoCmd.OpenReport メソッド (Access)」リファレンス
https://docs.microsoft.com/ja-jp/office/vba/api/access.docmd.openreport?WT.mc_id=DP-MVP-10329
————————————————————————————————–

あるデータから様々な条件でレポートを出力したいとき、レポートをひとつだけ作ってデータの中身を動的に絞り込むといい。レポートのデザインは手間がかかる作業だし、レポートが共通なら後からのデザイン変更もしやすい。レポートをひとつだけ作りデータを動的に絞り込んで表示するにはDoCmdオブジェクトのOpenReportメソッドを使用する。DoCmd.OpenReportの引数は6つあり、それぞれ次のような意味を持つが、最初の引数以外は省略可能だ。

DoCmd.OpenReport レポート名 , ビューの種類 , クエリ名 , 抽出条件 , ウィンドウモード , レポートに渡す文字列

この例では「抽出条件」と「レポートに渡す文字列」を使ってみる。用意したテーブルは「生徒」という名前にし、データは次のとおり。

Access_Report_001

<Fig.1 : 用意した「生徒」テーブル>

まずこのテーブルをもとにして全件表示する「生徒」レポートを作る。

Access_Report_002

<Fig.2 : 「生徒」データを全件表示する「生徒」レポート>

「作成」メニューの「空白のフォーム」でデータを絞り込むためのフォームを作る。フォームに「ラベル」と「テキストボックス」、そして「ボタン」を作る。ラベルには「『男』または『女』を入力する」といった説明を書いておく。テキストボックスは非連結、ボタンもウィザードを使わず何も設定しないでおく。テキストボックスの名前は「性別選択」とし、ボタンの名前は「レポート表示」とする。ボタンの表題は「レポートを開く」としよう。

Access_Report_003

<Fig.3 : データを絞り込みレポートを表示するフォームを作る>

「レポート表示」ボタンのプロパティを開き、クリック時のイベントプロシージャを記述しよう。Microsoft Visual Basic for Applicationエディタが起動したら次のような式を書く。

DoCmd.OpenReport “生徒”, acViewPreview, , “[性別] = ‘” & [性別選択] & “‘”, , “生徒名簿(” & [性別選択] & “)”

最初の引数、”生徒”、は表示するレポート名を示す。2番目の引数は印刷プレビューを指定しており、これがないといきなりプリンタに出力されてしまう。3番目の引数は省略。4番目の引数は絞り込む条件を記述している。データの[性別]がフォームの[性別選択]テキストボックスに入力されたものと同じものだけを絞り込む記述だ。5番目の引数は省略。最後6番目の引数で、レポートに「生徒名簿(男)」のように文字列を返すようにしている。

Access_Report_004

<Fig.4 : Microsoft Visual Basic for Applicationエディタにコードを記述した>

コードが記述できたらフォームを開きテキストボックスに「男」または「女」と入力して「レポートを開く」ボタンをクリックしてみよう。

Access_Report_005

<Fig.5 : 作ったフォームを開きテキストボックスに「男」と入力して「レポートを開く」ボタンをクリックする>

Access_Report_006

<Fig.6 : データが絞り込まれた「生徒」レポートが表示した>

最後にDoCmd.OpenReport式の最後の6番目の引数がレポートに反映されるようにしよう。この引数の値は、[OpenArgs]の値で表示することができる。

引数の値を表示するためレポートをデザインし、「生徒」となっているラベルをテキストボックスに変更し、テキストボックスのコントロールソースを「[OpenArgs]」とする。

Access_Report_007

<Fig.7 : DoCmd.OpenReport式の6番目の引数を表示するためテキストボックスのレポートに反映されるようにコントロールソースを「[OpenArgs]」とする>

レポートを保存し、フォームからデータを絞り込んでレポートを表示してみよう。

Access_Report_008

<Fig.8 : 絞り込み条件を「男」にしてレポートを開く>

Access_Report_009

<Fig.9 : 条件が「男」に絞り込まれ表題のテキストボックスに引数が表示されている>

Access_Report_010

<Fig.10 : 絞り込み条件を「女」にしてレポートを開く>

Access_Report_011

<Fig.11 : 条件が「女」に絞り込まれ表題のテキストボックスに引数が表示されている>

(追記)2020.09.28
————————————————————————————————–
この記事で紹介している DoCmd.OpenReport メソッドについては、次のマイクロソフトの Docs.com を参照すればよいだろう。
Microsoft Docs.com「DoCmd.OpenReport メソッド (Access)」リファレンス
https://docs.microsoft.com/ja-jp/office/vba/api/access.docmd.openreport?WT.mc_id=DP-MVP-10329
————————————————————————————————–

Written by Yoshio Matsumoto

2012年7月16日 at 3:53 午前

Access – レコードソースを設定せずテキストボックスに入力した文字列によってSQL文でデータを絞り込みVBAで動的にテーブルのレコードを取得する

leave a comment »

(追記)2020.09.28
————————————————————————————————–
この記事では次のようなコードを紹介している。
Me.RecordSource = “select * from 生徒1 where 氏名 = ‘” & 検索氏名 & “‘”
このときの「RecordSource」については、次のマイクロソフトの Docs.com を参照すればよいだろう。
Microsoft Docs.com「”RecordSource/レコードソース” プロパティ (Access)」リファレンス
https://docs.microsoft.com/ja-jp/office/vba/api/access.form.recordsource?WT.mc_id=DP-MVP-10329
————————————————————————————————–

前回、前々回に、アクセスのフォームやレポートでレコードソースをプロパティに設定せず、VBAからSQL文によってレコードソースを指定してデータを取得する方法の概要をまとめてみた。

「Access – レコードソースを設定せずVBAで動的にテーブルのレコードを取得する」
https://matsumotoyoshio.wordpress.com/2011/12/25/access-%e3%83%ac%e3%82%b3%e3%83%bc%e3%83%89%e3%82%bd%e3%83%bc%e3%82%b9%e3%82%92%e8%a8%ad%e5%ae%9a%e3%81%9b%e3%81%9avba%e3%81%a7%e3%83%86%e3%83%bc%e3%83%96%e3%83%ab%e3%81%ae%e3%83%ac%e3%82%b3/

「Access – レコードソースを設定せずSQL文でデータを絞り込みVBAで動的にテーブルのレコードを取得する」
https://matsumotoyoshio.wordpress.com/2011/12/25/access-%e3%83%ac%e3%82%b3%e3%83%bc%e3%83%89%e3%82%bd%e3%83%bc%e3%82%b9%e3%82%92%e8%a8%ad%e5%ae%9a%e3%81%9b%e3%81%9asql%e6%96%87%e3%81%a7%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e7%b5%9e%e3%82%8a/

今回はVBAによってフォームのテキストボックスに入力した文字列によってSQL文でデータを絞り込みVBAで動的にテーブルのレコードを取得する方法をまとめてみる。

テーブルのサンプルデータは、テーブル構造は前回までの説明で使ったものと同じだが、少しデータを増やした以下のようなものを使う。

Access_SQL_023

<Fig 1 : 絞り込み検索をするテストデータ>

検索するためのフォームは、新しい空白のフォームを作成し、フォームヘッダーを作成する。フォームヘッダーにはテキストボックスをひとつ、ボタンを2つ作成する。テキストボックスは非連結で、名前を「検索氏名」としておく。ボタンの表題には、それぞれ「全文一致」と「部分一致」とする。

詳細にはデータ表示のためのテキストボックスを3つ作成する。フォームのプロパティにはレコードソースを設定しないが、それぞれのテキストボックスのプロパティでコントロールソースには各フィールド、すなわち「学籍番号」、「氏名」、「性別」を記述しておく。

Access_SQL_024

<Fig 2 : データを検索して表示するフォームをデザインする>

フォームのデザインができたら、ボタンのイベントハンドラにVBAコードを書こう。コードを書くにはボタンを選択してプロパティシートの「イベント」タブで「クリック時」のイベントを「・・・」をクリックする。「ビルダーの選択」ウィンドウが表示されたら「コードビルダー」を選択して「OK」をクリックする。

「全文一致」ボタンのイベントハンドラには次のコードを記述する。

———————————————————————————

Me.RecordSource = “select * from 生徒1 where 氏名 = ‘” & 検索氏名 & “‘”

———————————————————————————

ここで記述するSQL文は、select * from 生徒1 where 氏名 = (「検索氏名」テキストボックスのテキスト)、であるが、「検索氏名」テキストボックスの記述方法は、ダブルクォーテーションで囲まれたSQL文の外に「&」演算子で接続する。検索氏名の実態はテキストなのでシングルクォーテーションで囲む。したがって「&」で挟まれる「検索氏名」テキストボックスの記述の前後は、シングルクォーテーションとダブルクォーテーションで挟まれることになる。

次に「部分一致」ボタンのイベントハンドラには次のコードを記述する。

———————————————————————————

Me.RecordSource = “select * from 生徒1 where 氏名 like ‘*” & 検索氏名 & “*'”

———————————————————————————

ここで記述するSQL文は、select * from 生徒1 where 氏名 like *(「検索氏名」テキストボックスのテキスト)*、である。「検索氏名」に入力された文字列の前後を「*」で囲み、文字列を含む指定にする。上と同様に「検索氏名」テキストボックスの記述方法は、ダブルクォーテーションで囲まれたSQL文の外に「&」演算子で接続するので、「&」で挟まれる「検索氏名」テキストボックスの記述の前後は、シングルクォーテーションとアステリスク、そしてダブルクォーテーションで挟まれることになる。

VBAコードの全文は次のようになる。

———————————————————————————

Private Sub コマンド1_Click()
Me.RecordSource = “select * from 生徒1 where 氏名 = ‘” & 検索氏名 & “‘”
End Sub

Private Sub コマンド2_Click()
Me.RecordSource = “select * from 生徒1 where 氏名 like ‘*” & 検索氏名 & “*'”
End Sub

———————————————————————————

Access_SQL_025
<Fig 3 : ボタンのイベントハンドラにVBAでSQL文を記述する>

コードを記述したらフォームを開いてみよう。フォームが開いた時点ではレコードソースが指定されていないので、データは何も表示されず、テキストボックスは「#Name?」となってエラー表示になる。

「検索氏名」に文字列を入力し、「全文一致」か「部分一致」のボタンをクリックする。たとえば「織田 信長」のようにフルネームを入力し「全文一致」ボタンかまたは「部分一致」ボタンをクリックすると「織田 信長」のレコードだけが表示される。「徳川」のように氏名の一部だけ入力したときは、「全文一致」では何も表示されず、「部分一致」のボタンをクリックしたときに、部分一致したデータが表示される。

Access_SQL_026

<Fig 4 : フォーム「生徒フォーム」を開いてもデータは何も表示されない>

Access_SQL_027

<Fig 5 : 「検索氏名」テキストボックスに「織田 信長」と入力して「全文一致」または「部分一致」ボタンをクリックした>

Access_SQL_028

<Fig 6 : 「検索氏名」テキストボックスに「徳川」と入力して「全文一致」ボタンをクリックしてもデータは表示されない>

Access_SQL_029

<Fig 7 : 「検索氏名」テキストボックスに「徳川」と入力して「部分一致」ボタンをクリックして3件のレコードが表示された>

(追記)2020.09.28
————————————————————————————————–
この記事では次のようなコードを紹介している。
Me.RecordSource = “select * from 生徒1 where 氏名 = ‘” & 検索氏名 & “‘”
このときの「RecordSource」については、次のマイクロソフトの Docs.com を参照すればよいだろう。
Microsoft Docs.com「”RecordSource/レコードソース” プロパティ (Access)」リファレンス
https://docs.microsoft.com/ja-jp/office/vba/api/access.form.recordsource?WT.mc_id=DP-MVP-10329
————————————————————————————————–

Written by Yoshio Matsumoto

2011年12月26日 at 11:32 午後

Access – レコードソースを設定せずSQL文でデータを絞り込みVBAで動的にテーブルのレコードを取得する

with 3 comments

Accessでフォームやレポートを作りデータを表示するとき、一般的にはレコードソースをフォームのプロパティに指定するが、レコードソースを設定せずにフォームやレポートを作成し、VBAで動的にレコードソースを指定するとSQL文が使える。SQLに熟練しているなら、この方法で自由にレコードソースを扱うことができ、応用しやすい。

(追記)2020.09.28
————————————————————————————————–
この記事では次のようなコードを紹介している。
Me.RecordSource = “select 学籍番号,氏名,性別 from 生徒1”
このときの「RecordSource」については、次のマイクロソフトの Docs.com を参照すればよいだろう。
Microsoft Docs.com「”RecordSource/レコードソース” プロパティ (Access)」リファレンス
https://docs.microsoft.com/ja-jp/office/vba/api/access.form.recordsource?WT.mc_id=DP-MVP-10329
————————————————————————————————–

レコードソースを設定せずにフォームを作りVBAでSQL文を書き動的にデータを取得する方法の概要は以下のページを見てほしい。

「Access – レコードソースを設定せずVBAで動的にテーブルのレコードを取得する」
https://matsumotoyoshio.wordpress.com/2011/12/25/access-%e3%83%ac%e3%82%b3%e3%83%bc%e3%83%89%e3%82%bd%e3%83%bc%e3%82%b9%e3%82%92%e8%a8%ad%e5%ae%9a%e3%81%9b%e3%81%9avba%e3%81%a7%e3%83%86%e3%83%bc%e3%83%96%e3%83%ab%e3%81%ae%e3%83%ac%e3%82%b3/

さて、ここで使うSQL文にデータを絞り込むものを使ってみよう。たとえば「男」のデータだけ取得する次のようなSQL文だ。

——————————————————————————–

select 学籍番号,氏名,性別 from 生徒1 where 性別 = 男

——————————————————————————–

まずテーブル「生徒1」に次のようなデータを用意する。

Access_SQL_016

<Fig 1 : テーブル「生徒1」に用意したサンプルデータ>

フォームの作成でレコードソースを指定せずに「生徒フォーム」を作成する。新しいフォームができたらデザインビューにし、「フォームヘッダー/フッター」を作り、フォームの既定のビューを「帳票フォーム」に変更する。フォームヘッダーと詳細の高さを調節する。

次に「詳細」エリアにテキストボックスを3つ作る。各テキストボックスは、プロパティの「データ」タブ「コントロールソース」に、それぞれ表示させたいフィールド名「学籍番号」、「氏名」、「性別」を記述する。通常レコードソースを設定したフォームの編集では、ここでテーブルのレコードソースが表示されドロップダウンリストから選択できるが、ここではレコードソースが設定していないのでリスト表示はされない。キーボードから文字入力でフィールドを設定しておく。

そしてフォームヘッダーには3つボタンを作成する。ボタンの「表題」はそれぞれ「全部」、「男だけ」、「女だけ」としておこう。

Access_SQL_017

<Fig 2 : データを取得するフォームをデザインする>

そしてボタンのクリックイベントに以下のVBAコードを記述する。このときSQL文では、スタティックな文字列はシングルクォーテーション「’」で囲む。

———————————————————————————

Private Sub コマンド1_Click()
Me.RecordSource = “select 学籍番号,氏名,性別 from 生徒1”
End Sub

Private Sub コマンド2_Click()
Me.RecordSource = “select 学籍番号,氏名,性別 from 生徒1 where 性別 = ‘男'”
End Sub

Private Sub コマンド3_Click()
Me.RecordSource = “select 学籍番号,氏名,性別 from 生徒1 where 性別 = ‘女'”
End Sub

———————————————————————————

Access_SQL_018

<Fig 3 : ボタンのクリックイベントにVBAでSQL文を書く>

このフォームを実行すると、フォームを開いたときにはレコードソースが設定されていないのでテキストボックスにはエラーが表示され、「全部」のボタンをクリックすると全てのデータが、「男だけ」では男のデータだけ、「女だけ」では女のデータだけが表示される。

Access_SQL_019

<Fig 4 : フォームを開いたところ>

Access_SQL_020

<Fig 5 : 「全部」ボタンをクリックして全件データを取得した>

Access_SQL_021

<Fig 6 : 「男だけ」ボタンをクリックして男のデータだけを取得した>

Access_SQL_022

<Fig 7 : 「女だけ」ボタンをクリックして女のデータだけを取得した>

(追記)2020.09.28
————————————————————————————————–
この記事では次のようなコードを紹介している。
Me.RecordSource = “select 学籍番号,氏名,性別 from 生徒1”
このときの「RecordSource」については、次のマイクロソフトの Docs.com を参照すればよいだろう。
Microsoft Docs.com「”RecordSource/レコードソース” プロパティ (Access)」リファレンス
https://docs.microsoft.com/ja-jp/office/vba/api/access.form.recordsource?WT.mc_id=DP-MVP-10329
————————————————————————————————–

Written by Yoshio Matsumoto

2011年12月25日 at 3:25 午後

Access – レコードソースを設定せずVBAで動的にテーブルのレコードを取得する

with 5 comments

アクセスのフォームやレポートは通常レコードソースをプロパティ値に設定してデータを表示する。しかしあらかじめレコードソースを設定しなくても、VBAを使って動的にレコードソースを設定し、データを表示することができる。このときレコードソースの記述がSQL文でできるので、SQLを使ったレコード操作に慣れた人には、このVBAを使った処理はわかりやすく、応用しやすいだろう。たとえばこんなかんじだ。

(追記)2020.09.28
————————————————————————————————–
この記事では次のようなコードを紹介している。
Me.RecordSource = “select 学籍番号,氏名,性別 from 生徒2”
このときの「RecordSource」については、次のマイクロソフトの Docs.com を参照すればよいだろう。
Microsoft Docs.com「”RecordSource/レコードソース” プロパティ (Access)」リファレンス
https://docs.microsoft.com/ja-jp/office/vba/api/access.form.recordsource?WT.mc_id=DP-MVP-10329
————————————————————————————————–

まずAccessデータベース上に2つのテーブル「生徒1」と「生徒2」を作ってみる。テーブルのフィールドはどちらも同じ構造とし、「学籍番号」、「氏名」、「性別」があるとする。しかしデータの内容は違う。

Access_SQL_001

<Fig 1 : 「生徒1」テーブルを作成する>

Access_SQL_002

<Fig 2 : 「生徒2」テーブルを作成する>

テーブルを作成し適当なデータを作れば、次にフォームを作成する。Access2003の場合は「挿入」-「フォーム」で「新しいフォーム」ウィンドウを開き「基になるテーブルまたはクエリの選択」を空白にしたまま「デザインビュー」をクリックする。Access2007とAccess2010の場合は「作成」-「空白のフォーム」をクリックする。

新しいフォームができたらデザインビューにし、「フォームヘッダー/フッター」を作り、フォームの既定のビューを「帳票フォーム」に変更する。フォームヘッダーと詳細の高さを調節する。フォームの名前は「生徒フォーム」として保存しておこう。

Access_SQL_003

<Fig 3 : レコードソースを指定しないフォームを作る>

ここでいちどフォームを「フォームビュー」にして表示してみよう。レコードソースが指定されておらず、テキストボックスもなにもないので、単に真っ白な画面が表示されるだけである。

Access_SQL_004

<Fig 4 : レコードソースを指定しないフォームを表示した>

次に「詳細」エリアにテキストボックスを3つ作る。各テキストボックスは、プロパティの「データ」タブ「コントロールソース」に、それぞれ表示させたいフィールド名を記述する。通常レコードソースを設定したフォームの編集では、ここでテーブルのレコードソースが表示されドロップダウンリストから選択できるが、ここではレコードソースが設定していないのでリスト表示はされない。キーボードから文字入力でフィールドを設定する。

Access_SQL_005

<Fig 5 : 「学籍番号」、「氏名」、「性別」のテキストボックスを作成する>

テキストボックスを作成したら、もういちどフォームを開いてみよう。もちろんレコードソースが指定されていないので、データは何も表示されない。各フィールドには「#Name?」というエラーが表示されている。

Access_SQL_006

<Fig 6 : データソースが指定されていないフォームを開いたので「#Name?」エラーが表示される>

次にデータソースをVBAで記述するコードを書くが、このコードをボタンのクリックイベントで実行させることにする。そのためにフォームのフォームヘッダーに2つボタンを作成する。ボタンの「表題」はそれぞれ「生徒1データ」、「生徒2データ」としておこう。

Access_SQL_007

<Fig 7 : フォームヘッダーにボタンを2つ作り表題を設定した>

次にVBAコードを書くため、「生徒1データ」の表題を書いたボタンを選択し、プロパティの「イベント」タブから「クリック時」の横の「・・・」をクリックする。すると「ビルダーの選択」ウィンドウが表示されるので、「コードビルダー」を選択して「OK」をクリックする。

Access_SQL_008

<Fig 8 : ボタンのクリック時イベントをVBAで記述するためにコードビルダーを開く>

コードビルダーが開いたら、クリックイベントに対応するイベントプロシージャができている。ここに次のコードを書く。

——————————————————————————–

Me.RecordSource = “select 学籍番号,氏名,性別 from 生徒1”

——————————————————————————–

ダブルクオーテーションで挟まれた部分は単純なSQL文である。

Access_SQL_009

<Fig 9 : コードビルダーでイベントプロシージャを表示する>

Access_SQL_010

<Fig 10 : コードビルダーにレコードソースを指定するコードを書く>

コードが書けたらフォームを開いてみよう。フォームを開いた時点ではレコードソースが指定されていないので、各テキストボックスには「#Name?」のエラーが表示されているが、「生徒1データ」ボタンをクリックすると「生徒1」テーブルを指定したクエリが実行され、データが表示される。

Access_SQL_011

<Fig 11 : レコードソースを指定しないフォームを開く>

Access_SQL_012

<Fig 12 : 「生徒1データ」ボタンのクリックでレコードソースを指定し「生徒1」テーブルのデータを表示した>

では次に「生徒2データ」ボタンのクリックイベントで「生徒2」テーブルからデータを取得するレコードソースを記述しよう。SQL文のfrom句でテーブル名を変更するだけだ。

Access_SQL_013

<Fig 13 : 「生徒2データ」ボタンのイベントプロシージャにレコードソースを指定するコードを書く>

これで「生徒1データ」ボタンをクリックすると「生徒1」テーブルのデータを表示し、「生徒2データ」ボタンをクリックすると「生徒2」テーブルのデータを表示するフォームができた。

Access_SQL_014

<Fig 14 : 完成したフォームを開き「生徒2データ」ボタンをクリックすると「生徒2」テーブルのデータが表示される>

Access_SQL_015

<Fig 15 : 完成したフォームを開き「生徒1データ」ボタンをクリックすると「生徒1」テーブルのデータが表示される>

このようにフォームやレポートをデータソースの指定なしに作成し、ボタンクリックなどで動的にレコードソースを指定してデータを表示させることができる。ここで重要なことは、レコードソースの記述が一般的なSQL文で記述できることである。SQL文に習熟したものなら、自由にレコードセットを記述してフォームやレポートに動的に表示させることができる。とてもわかりやすい。

(追記)2020.09.28
————————————————————————————————–
この記事では次のようなコードを紹介している。
Me.RecordSource = “select 学籍番号,氏名,性別 from 生徒2”
このときの「RecordSource」については、次のマイクロソフトの Docs.com を参照すればよいだろう。
Microsoft Docs.com「”RecordSource/レコードソース” プロパティ (Access)」リファレンス
https://docs.microsoft.com/ja-jp/office/vba/api/access.form.recordsource?WT.mc_id=DP-MVP-10329
————————————————————————————————–

Written by Yoshio Matsumoto

2011年12月25日 at 2:08 午後

WordPressのblogシステムは統計情報が優れている

leave a comment »

Windows Live BlogからWordPressに変更して3か月ほど経つ。WordPressのblogシステムで最もうれしいのはWindows Live Writerとの親和性だ。WordPressのような多機能のblogシステムをWebブラウザ上で編集するのはストレスが高い。ブラウザ上ではなく記事を編集できるWindows Live Writerはとてもいい。

しかしWindows Live WriterはWindows Live Blogでも使えた、というか、もともとWindows Live Blogに対応した記事編集ツールであったといえる。そこでWindows Live Blogに足りなかった機能でいちばん気に入っているものは、といえば、これはもう統計情報に決まりだ。WordPressでは実に詳細なアクセス統計情報がとれる。

アクセス統計情報をみると、意外な記事に注目されていることがわかる。blogの記事は、TwitterやFaceBookなど他のSNSで紹介してリンクをたどられる場合も多いが、googleやbingなどの検索サイトでヒットする場合もある。このblogは本来InfoPathやSQL Server、システム開発、システム運用などの事例を紹介しているつもりだが、統計情報を見ると思わぬ記事に注目されていることがわかる。直近の一定期間のアクセス統計をみたのが次の画面だ。

閲覧ランキング20110310_edit

ホームページ、つまりトップページの閲覧回数が多いのは当然として、その次に多く見られているのが、文庫本をPDF化してKindleで読む記事だ。ちなみに他にもKindle関係の記事は閲覧回数の上位に出ている。

その次にエクセルのマクロの記事が出てくる。これも他のエクセルマクロの記事も閲覧回数上位にでてくる。世の中にはよほどエクセルのマクロで図形の操作に困っている人が多いのか、あるいは図形に関する記事が他に少ないからだろうか。もちろん、そもそもエクセルのマクロをやっている人の母数が多いということもあるだろう。VBAマクロがこれほど流行したのも、エクセルでの利用が多いからに違いない。

他はキャノンのプリンタPIXUS iP100の記事が2つあるが、これも他に情報源が少ないからのような気がする。Expression Blend 4の記事が読まれているのは、たいしたことを書いていないので、いささか恥ずかしいところもある。

もちろん閲覧回数を増やすことを目的にしていないので、どの記事が誰にどれだけ読まれているか気にしている訳ではないのだが、こうして統計情報を見るといろんなことを考えさせられて面白い。

Written by Yoshio Matsumoto

2011年3月11日 at 12:51 午前

エクセルのマクロで図形を操作する(4) – オートシェイプを消去する

leave a comment »

(追記)2020.09.28
————————————————————————————————–
この記事で紹介している、マクロで図形を作る方法については、次のマイクロソフトの Docs.com を参照すればよいだろう。
Microsoft Docs.com「AddShape メソッド (Excel)」リファレンス
https://docs.microsoft.com/ja-JP/office/vba/api/Excel.Shapes.AddShape?WT.mc_id=M365-MVP-10329
————————————————————————————————–

ではエクセルのシートに作ったオートシェイプを消去するにはどうすればいいだろうか。オートシェイプを削除するには、deleteメソッドが使えるはずだ。試しに次の2つのマクロを作ってみよう。

————————————————————————

Sub smaile()
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, 10, 20, 100, 100
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, 120, 20, 100, 100
End Sub

————————————————————————

Sub delete()
Sheet1.Shapes(1).delete
Sheet1.Shapes(2).delete
End Sub

————————————————————————

最初のマクロでは、スマイルのオートシェイプを2つ作っている。これら2つのオートシェイプはそれぞれShapes(1)とShapes(2)という番号で管理されている。そして次のマクロでは、そのShapes(1)とShapes(2)に対して消去のDeleteメソッドを実行している。だが残念ながらこのマクロは、消去するときにエラーになる。ひとつめのシェイプを消去した後「指定したコレクションに対するインデックスが境界を越えています。」というメッセージが出るはずだ。なぜかといえば、Shapes(1)を消去したときに、自動的にShapes(2)がShapes(1)になってしまうからだ。そこで消去する順番は、まず数字の大きいShapes(2)を消去し、その次にShapes(1)を消去する、というようにすればいい。次のマクロは正しく動くだろう。

————————————————————————

Sub smaile()
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, 10, 20, 100, 100
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, 120, 20, 100, 100
End Sub

————————————————————————

Sub delete()
Sheet1.Shapes(2).delete
Sheet1.Shapes(1).delete
End Sub

————————————————————————

あるいは次のように、Shapes(1)を二回消去する、というようにしてもうまく消去できる。

————————————————————————

Sub smaile()
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, 10, 20, 100, 100
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, 120, 20, 100, 100
End Sub

————————————————————————

Sub delete()
Sheet1.Shapes(1).delete
Sheet1.Shapes(1).delete
End Sub

————————————————————————

(追記)2020.09.28
————————————————————————————————–
この記事で紹介している、マクロで図形を作る方法については、次のマイクロソフトの Docs.com を参照すればよいだろう。
Microsoft Docs.com「AddShape メソッド (Excel)」リファレンス
https://docs.microsoft.com/ja-JP/office/vba/api/Excel.Shapes.AddShape?WT.mc_id=M365-MVP-10329
————————————————————————————————–

Written by Yoshio Matsumoto

2010年12月25日 at 7:01 午後

エクセルのマクロで図形を操作する(3) – オートシェイプに名前をつける

with one comment

(追記)2020.09.28
————————————————————————————————–
この記事で紹介している、マクロで図形を作る方法については、次のマイクロソフトの Docs.com を参照すればよいだろう。
Microsoft Docs.com「AddShape メソッド (Excel)」リファレンス
https://docs.microsoft.com/ja-JP/office/vba/api/Excel.Shapes.AddShape?WT.mc_id=M365-MVP-10329
————————————————————————————————–

エクセルのシート上に作成したオートシェイプは番号がついているが、番号ではなく、オートシェイプに名前を付けて区別することもできる。例えばこんな具合だ。

Sub smaile()
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, 10, 20, 100, 100
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, 120, 20, 100, 100
ActiveSheet.Shapes(1).Name = “taro”
ActiveSheet.Shapes(2).Name = “hanako”
Sheet1.Shapes(“taro”).IncrementRotation (-20)
Sheet1.Shapes(“hanako”).IncrementRotation (20)
Sheet1.Shapes(“taro”).Adjustments.Item(1) = 0.5
Sheet1.Shapes(“hanako”).Width = 160
Sheet1.Shapes(“hanako”).Height = 160
End Sub

excel_macro_002
(Fig.1 オートシェイプを2つ作成し名前を付けて角度や変形、大きさを変えた)

ここでは作成した2つのオートシェイプに「taro」と「hanako」という名前をつけている。「taro」に操作をするときはShapes(“taro”)、「hanako」に操作をするときはShapes(“hanako”)と記述して区別できる。ここでは「taro」を左に20度(つまり右に-20度)回転、変形を0.5、「hanako」は右に20度回転、幅と高さを160に拡大している。

(追記)2020.09.28
————————————————————————————————–
この記事で紹介している、マクロで図形を作る方法については、次のマイクロソフトの Docs.com を参照すればよいだろう。
Microsoft Docs.com「AddShape メソッド (Excel)」リファレンス
https://docs.microsoft.com/ja-JP/office/vba/api/Excel.Shapes.AddShape?WT.mc_id=M365-MVP-10329
————————————————————————————————–

Written by Yoshio Matsumoto

2010年7月19日 at 9:14 午前