「前任者の作成したプログラムの変数の先頭に、いくら参考書やヘルプで調べても見つからない文字列がついている」
というご質問を頂くことあります。
ソースを拝見してみると str商品 とか int数量 のように先頭に3文字の英文字が表示されています。
これは「接頭辞」または「プリフィックス」と言われるもので、変数の場合では、その変数の型が一目で分かるようにつけた文字列です。
例文を書いてみます。
Dim str商品 As String
Dim int数量 As Integer
str商品 = "コーヒー"
int数量 = 1000
のような使い方です。
長いプログラムの途中でいきなり「商品」という変数が出てくると、その変数にどのような値を代入してよいのかが判断できません。
プログラムを読みやすく分かりやすくするために付けておくと便利です。
他の文法と異なり、String型の場合、必ず str とつけなければならないわけではありませんが、習慣でVBA、またはVBだとよく利用される使い方というのもあります。
社内で複数の人で作成をしてマクロを使いまわすときには、社内の作成ルールとして決めておくことをお薦めしています。
2009年02月12日
接頭辞
posted by Three bit com at 10:00| Excel & Access
2009年02月04日
ExcelからAccessへのインポートエラー
Excel(エクセル)のデータをAccess(アクセス)に移行する際に、Accessの「インポート」コマンドを使用することができます。
その際に一部のデータがAccessのテーブルにインポートできないことがあります。
この作業で躓いてしまい、仕事持込セミナーやAccess関連の講習会にご参加頂くケースもあります。
色々な原因が考えられますが、例えばExcelで行内改行(Alt+Enterキー)をしているデータがエラーになってしまう場合があります。
特に行の高さを狭めていると目で見ても分からないため、データ件数が多い場合には困ります。
対応策として例えばCLEAN関数を使うと便利です。
A1に行内改行が挿入されている場合、B1に次の式を入力します。
=CLEAN(A1)
Alt+Enterで入力した改行をこれだけで取り除くことができますので、インポート時にエラーが出るようであれば、可能性のありそうなフィールド・レコード全てに同様の処理を行ってからAccessでインポートをしてみてください。
Accessのシステム完成後にデータの移行がうまく行かず、システム運用開始に時間がかかるケースを非常に多く拝見します。
初めてシステムを作成する場合には、ついつい後回しになりがちなデータのクリーニング作業ですが、システムを作成しながら、平行して早い段階でデータのチェックもしておきたいですね。
その際に一部のデータがAccessのテーブルにインポートできないことがあります。
この作業で躓いてしまい、仕事持込セミナーやAccess関連の講習会にご参加頂くケースもあります。
色々な原因が考えられますが、例えばExcelで行内改行(Alt+Enterキー)をしているデータがエラーになってしまう場合があります。
特に行の高さを狭めていると目で見ても分からないため、データ件数が多い場合には困ります。
対応策として例えばCLEAN関数を使うと便利です。
A1に行内改行が挿入されている場合、B1に次の式を入力します。
=CLEAN(A1)
Alt+Enterで入力した改行をこれだけで取り除くことができますので、インポート時にエラーが出るようであれば、可能性のありそうなフィールド・レコード全てに同様の処理を行ってからAccessでインポートをしてみてください。
Accessのシステム完成後にデータの移行がうまく行かず、システム運用開始に時間がかかるケースを非常に多く拝見します。
初めてシステムを作成する場合には、ついつい後回しになりがちなデータのクリーニング作業ですが、システムを作成しながら、平行して早い段階でデータのチェックもしておきたいですね。
posted by Three bit com at 10:00| Access(アクセス)
2009年01月29日
行と列を入れ替える
Excel(エクセル)のワークシート内で、1列に入力されているデータを、1行のデータとして入れ替えたい場合があります。
例えば以下のような例です。
(元データ)
-----
A1
-----
A
B
C
(入れ替え後)
-------------------------------
B1 C1 D1 E1
-------------------------------
A B C D
「形式を選択して貼り付け」を利用すると行と列を入れ替えてコピーすることができます。
(元データ)を選択してコピーします。
コピー先(上の場合ではB1)を選択します。
[編集]メニュー→[形式を選択して貼り付け]→[行列を入れ替える]チェックボックスを
オンにして[OK]ボタンを押します。
Excel(エクセル)関連のセミナー中のデモで利用すると、時々ご質問を頂くことがあります。
使用頻度はそれほど高くはありませんが、ちょっとした表の変換作業に使えますので便利ですね。
例えば以下のような例です。
(元データ)
-----
A1
-----
A
B
C
(入れ替え後)
-------------------------------
B1 C1 D1 E1
-------------------------------
A B C D
「形式を選択して貼り付け」を利用すると行と列を入れ替えてコピーすることができます。
(元データ)を選択してコピーします。
コピー先(上の場合ではB1)を選択します。
[編集]メニュー→[形式を選択して貼り付け]→[行列を入れ替える]チェックボックスを
オンにして[OK]ボタンを押します。
Excel(エクセル)関連のセミナー中のデモで利用すると、時々ご質問を頂くことがあります。
使用頻度はそれほど高くはありませんが、ちょっとした表の変換作業に使えますので便利ですね。
posted by Three bit com at 10:00| Excel(エクセル)
2009年01月25日
選択範囲にデータ入力
先日のExcelVBA(エクセルマクロ)の入門セミナーで面白いご質問を頂きました。
Excelのリストやデータベース(Access他)と組み合わせてプログラミングすると、便利なツールが作れるかも知れませんので、ご紹介いたします。
ドラッグされているセル範囲にデータを連続書き込みするためのプログラムです。
セル範囲をどのように認識するかがポイントですが、いくつか方法があると思います。
ここでは選択範囲の行数と列数を求めて、縦の行数分を繰り返すForの処理に加え、
横の列数分だけ繰り返すForの処理を追加してみました。
ExcelVBA入門セミナーレベルで繰り返し処理を始めて使う方には、Forの中にForを入れる繰り返し処理をマスターする練習になるかも知れません。
プログラムを見ただけではピンと来ない場合は、F8(ステップイン)を使ってExcelの動きを見ながら考えてみると分かりやすいと思います。
Sub 選択範囲にデータ入力()
Dim 行数 As Long
Dim 列数 As Integer
行数 = Selection.Rows.Count '選択範囲の行数を数える
列数 = Selection.Columns.Count '選択範囲の列数を数える
'横の列数分だけ繰り返すためのFor
For 横カウンタ = 0 To 列数 - 1
'縦の行数分だけ繰り返すためのFor
For 縦カウンタ = 0 To 行数 - 1
ActiveCell.Offset(縦カウンタ, 横カウンタ).Value = "A"
Next 縦カウンタ '次の行へ
Next 横カウンタ '次の列へ
End Sub
基本的なVBAの文法を学習しただけでも、Excelでの実務経験が多い場合には面白いアイディアが色々と出てきますね。こういうところがExcelの面白さでもあると思いました。
Excelのリストやデータベース(Access他)と組み合わせてプログラミングすると、便利なツールが作れるかも知れませんので、ご紹介いたします。
ドラッグされているセル範囲にデータを連続書き込みするためのプログラムです。
セル範囲をどのように認識するかがポイントですが、いくつか方法があると思います。
ここでは選択範囲の行数と列数を求めて、縦の行数分を繰り返すForの処理に加え、
横の列数分だけ繰り返すForの処理を追加してみました。
ExcelVBA入門セミナーレベルで繰り返し処理を始めて使う方には、Forの中にForを入れる繰り返し処理をマスターする練習になるかも知れません。
プログラムを見ただけではピンと来ない場合は、F8(ステップイン)を使ってExcelの動きを見ながら考えてみると分かりやすいと思います。
Sub 選択範囲にデータ入力()
Dim 行数 As Long
Dim 列数 As Integer
行数 = Selection.Rows.Count '選択範囲の行数を数える
列数 = Selection.Columns.Count '選択範囲の列数を数える
'横の列数分だけ繰り返すためのFor
For 横カウンタ = 0 To 列数 - 1
'縦の行数分だけ繰り返すためのFor
For 縦カウンタ = 0 To 行数 - 1
ActiveCell.Offset(縦カウンタ, 横カウンタ).Value = "A"
Next 縦カウンタ '次の行へ
Next 横カウンタ '次の列へ
End Sub
基本的なVBAの文法を学習しただけでも、Excelでの実務経験が多い場合には面白いアイディアが色々と出てきますね。こういうところがExcelの面白さでもあると思いました。
posted by Three bit com at 10:00| Excel(エクセル)
2009年01月17日
未定の関数エラー
Access(アクセス)のヘルプにも出ている関数を使っているし、他の人のPCではちゃんと動くのに、自分のPCではなぜか動かない、というご質問をAccess関連のセミナーで伺うことがあります。
拝見してみると、
Access(アクセス)のクエリを開こうとすると
「式に未定義関数 '○○○' があります」
というエラーが表示されて実行できないケースです。
この場合、まず確認して頂きたいのが「参照設定」です。
Alt+F11を押して、VBEを起動して、[ツール]メニューから[参照設定]を確認してください。
[参照設定] ダイアログボックスに
[参照不可:○○○・・・] という項目にチェック ボックスがオンになっている参照があるようでしたら、その参照へのチェックボックスをオフにするとエラーが出なくなります。
拝見してみると、
Access(アクセス)のクエリを開こうとすると
「式に未定義関数 '○○○' があります」
というエラーが表示されて実行できないケースです。
この場合、まず確認して頂きたいのが「参照設定」です。
Alt+F11を押して、VBEを起動して、[ツール]メニューから[参照設定]を確認してください。
[参照設定] ダイアログボックスに
[参照不可:○○○・・・] という項目にチェック ボックスがオンになっている参照があるようでしたら、その参照へのチェックボックスをオフにするとエラーが出なくなります。
posted by Three bit com at 10:00| Access(アクセス)
2009年01月09日
レポートの背景色
Accessのセミナーで、レポートに罫線を効率的に作成する方法をご質問頂くことが少なくありません。
Access以外の例えばVB、VB.NET、PHPなどを使ってWindowsフォームやWebアプリを作成する場合を考えると、それでもAccessのレポートはずっと簡単なのですが、Excel(エクセル)の簡便さに比べると、やはり手間がかかるという印象は強いように思います。
罫線を作成する代わりに、VBAを使って背景色を1行おきに変更して対処している例をよく拝見します。
考え方のポイントで基本となるのは
レポート「詳細」セクションの「フォーマット時」イベント
だと思います。
レコードを1行ずつ読み取るごとに「フォーマット時」というイベントが発生しますので、フォーマット時イベントに、
例えば、奇数行ならば、詳細セクションの背景色をグレーにし、それ以外なら(偶数行なら)、詳細セクションの背景色を白くする、という考え方になります。
色々な書き方がありますが、例えば簡単な例を1つ書いてみると以下のようになります。
Dim i As Long 'この行は宣言セクションに記載します。
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
i = i + 1
If i Mod 2 = 1 Then '2で割った余りを求め、それが1と等しいかどうか判断しています。
詳細.BackColor = 16777215 '白
Else '条件に該当しない2で割った余りが 0となる場合です。偶数行が該当します。
詳細.BackColor = 12632256 'グレー
End If
End Sub
1レコードずつ読み取られてる度にフォーマット(Format)イベントが発生することを理解しておくと、他にも活用範囲が広がりますので、レポートの大事なイベントの一つだろうと思います。
Access以外の例えばVB、VB.NET、PHPなどを使ってWindowsフォームやWebアプリを作成する場合を考えると、それでもAccessのレポートはずっと簡単なのですが、Excel(エクセル)の簡便さに比べると、やはり手間がかかるという印象は強いように思います。
罫線を作成する代わりに、VBAを使って背景色を1行おきに変更して対処している例をよく拝見します。
考え方のポイントで基本となるのは
レポート「詳細」セクションの「フォーマット時」イベント
だと思います。
レコードを1行ずつ読み取るごとに「フォーマット時」というイベントが発生しますので、フォーマット時イベントに、
例えば、奇数行ならば、詳細セクションの背景色をグレーにし、それ以外なら(偶数行なら)、詳細セクションの背景色を白くする、という考え方になります。
色々な書き方がありますが、例えば簡単な例を1つ書いてみると以下のようになります。
Dim i As Long 'この行は宣言セクションに記載します。
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
i = i + 1
If i Mod 2 = 1 Then '2で割った余りを求め、それが1と等しいかどうか判断しています。
詳細.BackColor = 16777215 '白
Else '条件に該当しない2で割った余りが 0となる場合です。偶数行が該当します。
詳細.BackColor = 12632256 'グレー
End If
End Sub
1レコードずつ読み取られてる度にフォーマット(Format)イベントが発生することを理解しておくと、他にも活用範囲が広がりますので、レポートの大事なイベントの一つだろうと思います。
posted by Three bit com at 10:00| Access(アクセス)
2008年12月25日
可視セルの選択と集計
Excel(エクセル)でグループ集計を行う機能の一つに[データ]メニューの[集計]という機能があります。
Excelの応用レベルの講習会ではいつもご紹介しています。
ピボットテーブルに比べると機能名に特色がないせいか、意外にご存知ない方が多いようです。
この集計という機能を使うとExcel(エクセル)の行番号の左隣にアウトラインが表示され、一部のデータ(レコード)を非表示にしたり、再表示したりすることができます。
データを非表示にしたままの状態でレコードをコピーすると、非表示のデータも一緒にコピーされてしまいますので、範囲指定には一手間増えることになりご質問頂くことがあります。
Excel(エクセル)のジャンプ機能を使うと簡単に表示レコードだけを範囲指定することができます。
ジャンプ機能は
あらかじめコピーしたい範囲をドラッグしておきます。
[編集]メニューから[ジャンプ]を選択します。
[ジャンプ]ダイアログボックスの左下にある[セル選択]ボタンを押します。
[可視セル]というオプションをクリックし[OK]ボタンを押します。
非表示になっているセルは範囲指定されないため、画面はちょうどCtrlキーを押しながらドラッグしたような画面表示になって範囲が点滅します。
後は通常のコピーと貼り付けを使えば表示レコードだけをコピーすることができます。
便利な集計機能ではありますが、その特色を理解して使わないと不便に感じてしまうこともありますね。
Excelの応用レベルの講習会ではいつもご紹介しています。
ピボットテーブルに比べると機能名に特色がないせいか、意外にご存知ない方が多いようです。
この集計という機能を使うとExcel(エクセル)の行番号の左隣にアウトラインが表示され、一部のデータ(レコード)を非表示にしたり、再表示したりすることができます。
データを非表示にしたままの状態でレコードをコピーすると、非表示のデータも一緒にコピーされてしまいますので、範囲指定には一手間増えることになりご質問頂くことがあります。
Excel(エクセル)のジャンプ機能を使うと簡単に表示レコードだけを範囲指定することができます。
ジャンプ機能は
あらかじめコピーしたい範囲をドラッグしておきます。
[編集]メニューから[ジャンプ]を選択します。
[ジャンプ]ダイアログボックスの左下にある[セル選択]ボタンを押します。
[可視セル]というオプションをクリックし[OK]ボタンを押します。
非表示になっているセルは範囲指定されないため、画面はちょうどCtrlキーを押しながらドラッグしたような画面表示になって範囲が点滅します。
後は通常のコピーと貼り付けを使えば表示レコードだけをコピーすることができます。
便利な集計機能ではありますが、その特色を理解して使わないと不便に感じてしまうこともありますね。
posted by Three bit com at 10:00| Excel(エクセル)
2008年12月18日
MsgBoxで改行
ExcelVBA入門セミナーやAccessVBA入門セミナーの一番最初で、いつもご紹介しているMsgBox関数というものがあります。
例えばExcel(エクセル)を閉じるときに 「Book1への変更を保存しますか?」 のようなメッセージが表示されることがありますが、これもMsgBoxです。
このMsgBoxのダイアログ画面内で改行して、長い説明文や結果を表示したいときには改行を表す vbCrLf を使うことができます。例えば次のように & に続けて記載します。
MsgBox "終了します。" & vbCrLf & "よろしいですか?"
表示結果は次のように2行に分けて表示されます。
終了します。
よろしいですか?
vbCrLf 以外にも vbCr あるいは vbLf と書いても同じような動きをしますので、1つ覚えておくと便利ですし、3つとも同じように使えることを知っておくと、参考書や他の人が書いたプログラムを読むときに役立つと思います。
例えばExcel(エクセル)を閉じるときに 「Book1への変更を保存しますか?」 のようなメッセージが表示されることがありますが、これもMsgBoxです。
このMsgBoxのダイアログ画面内で改行して、長い説明文や結果を表示したいときには改行を表す vbCrLf を使うことができます。例えば次のように & に続けて記載します。
MsgBox "終了します。" & vbCrLf & "よろしいですか?"
表示結果は次のように2行に分けて表示されます。
終了します。
よろしいですか?
vbCrLf 以外にも vbCr あるいは vbLf と書いても同じような動きをしますので、1つ覚えておくと便利ですし、3つとも同じように使えることを知っておくと、参考書や他の人が書いたプログラムを読むときに役立つと思います。
posted by Three bit com at 10:00| Excel & Access
2008年12月16日
範囲名(名前の定義)
Excel(エクセル)には、セル範囲に名前を付ける機能があります。
色々な場合に使えるので便利なのですが、Excelの応用レベルの講習会や、ExcelVBAのセミナー時にご紹介することが多いのですが8〜9割の方が使ったことがないようです。
操作手順は、
あらかじめ名前を付けておきたいセル範囲をドラッグしておきます。
[挿入]メニューから[名前]の[定義]を選択します。
「名前の定義」ダイアログボックスが表示されますので、
「名前」欄に範囲名として付けておきたい名前を入力します。
[追加]ボタンを押した後に[OK]ボタンを押してダイアログを閉じます。
範囲名をつけたセル範囲にジャンプするには、
Excel(エクセル)の左上にある「名前ボックス」の右側の「▼」ボタンから範囲名を選択するだけで、
該当するセル範囲にジャンプすることができます。
「名前ボックス」とは、数式バーの左側で通常はアクティブセルのセル番地が表示されている
ボックスのことです。
よく利用するリストにジャンプする場合や印刷範囲を切り替えたい時にも便利ですが、他にはVLOOKUP関数の第二引数にもよく使われます。
VLOOKUPでデータを参照する際に、参照するデータ件数が増減した場合でも、関数を修正せずに範囲名の定義だけを修正すればよいのでお薦めです。
色々な場合に使えるので便利なのですが、Excelの応用レベルの講習会や、ExcelVBAのセミナー時にご紹介することが多いのですが8〜9割の方が使ったことがないようです。
操作手順は、
あらかじめ名前を付けておきたいセル範囲をドラッグしておきます。
[挿入]メニューから[名前]の[定義]を選択します。
「名前の定義」ダイアログボックスが表示されますので、
「名前」欄に範囲名として付けておきたい名前を入力します。
[追加]ボタンを押した後に[OK]ボタンを押してダイアログを閉じます。
範囲名をつけたセル範囲にジャンプするには、
Excel(エクセル)の左上にある「名前ボックス」の右側の「▼」ボタンから範囲名を選択するだけで、
該当するセル範囲にジャンプすることができます。
「名前ボックス」とは、数式バーの左側で通常はアクティブセルのセル番地が表示されている
ボックスのことです。
よく利用するリストにジャンプする場合や印刷範囲を切り替えたい時にも便利ですが、他にはVLOOKUP関数の第二引数にもよく使われます。
VLOOKUPでデータを参照する際に、参照するデータ件数が増減した場合でも、関数を修正せずに範囲名の定義だけを修正すればよいのでお薦めです。
posted by Three bit com at 10:00| Excel(エクセル)
2008年12月11日
ADOとは?
データベースと連携したシステム開発をしている開発者の中では日常的によく使うADOですが、セミナー参加者の方に伺うと、IT関連部門の方やデータベース開発経験がある方を除き、ほとんどの方がご存知ないようです。
ADOとはエーディーオーと呼びますがMicrosoft ActiveX Data Objectsの略称です。
AccessでAlt+F11を押してVBE(エディタ)を起動した後、[ツール]メニューの[参照設定]を確認してみてください。
Access2000〜2003では既定でチェックが付いていますので、すぐに使えますし、2007の場合もチェックを入れれば使えるようになります。
ADOは一言でその役割を説明すると「データベースとやり取りするためのマイクロソフトのテクノロジーの一つ」です。
Accessの場合では、例えばフォームからプログラムを起動し、テーブルやクエリの各レコード・各フィールドをきめ細かくコントロールしたい場合には、AccessのフォームからADOを利用して、Accessデータベースとやり取りをすることになります。
プログラミングの際には、AccessVBAのエディタ画面で、フォームやレポートをコントロールするAccessVBAの命令以外に、ADOのテクノロジーも併せて利用しながらプログラムを書いていくことになります。
前任者が作成したシステムを解析したい場合にも、プログラムの中に例えば、
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
のように、ADODBなどが含まれているようでしたら、ADOの知識も習得しておく必要があります。
また、最近ではExcelとAccessを連携させたシステム事例を多く拝見するようになりましたが、ExcelからもADOを使ってAccessのデータとのやり取りをすることができますので、知識が増えるほど業務での活用範囲は広がることと思います。
ADOとはエーディーオーと呼びますがMicrosoft ActiveX Data Objectsの略称です。
AccessでAlt+F11を押してVBE(エディタ)を起動した後、[ツール]メニューの[参照設定]を確認してみてください。
Access2000〜2003では既定でチェックが付いていますので、すぐに使えますし、2007の場合もチェックを入れれば使えるようになります。
ADOは一言でその役割を説明すると「データベースとやり取りするためのマイクロソフトのテクノロジーの一つ」です。
Accessの場合では、例えばフォームからプログラムを起動し、テーブルやクエリの各レコード・各フィールドをきめ細かくコントロールしたい場合には、AccessのフォームからADOを利用して、Accessデータベースとやり取りをすることになります。
プログラミングの際には、AccessVBAのエディタ画面で、フォームやレポートをコントロールするAccessVBAの命令以外に、ADOのテクノロジーも併せて利用しながらプログラムを書いていくことになります。
前任者が作成したシステムを解析したい場合にも、プログラムの中に例えば、
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
のように、ADODBなどが含まれているようでしたら、ADOの知識も習得しておく必要があります。
また、最近ではExcelとAccessを連携させたシステム事例を多く拝見するようになりましたが、ExcelからもADOを使ってAccessのデータとのやり取りをすることができますので、知識が増えるほど業務での活用範囲は広がることと思います。
posted by Three bit com at 10:00| Excel & Access