2008年12月09日

ワークシートを新規ブックにコピーする

ワークシートを、新しいブックを作成してそのブックにコピーする方法は簡単な記述ですが、かえって分かりにくいこともあるようです。

セミナーの実習時にマクロの記録を使ってVBAでの記述を調べて頂くと、よくそうしたご質問頂きます。
例えばSheet1を新規ブックに移動する処理は、マクロの記録では以下のように記録されます。

Sheets("Sheet1").Copy

Sheet1をコピーしているだけなのに、なぜ新しいブックが出るのだろう? という疑問が出てきます。
Copyというキーワードの上でF1(ヘルプ)を押して、WorksheetsオブジェクトのCopyメソッドを調べてみてください。

ヘルプ説明の解説欄に説明が書かれています。
Copyメソッドは本来引数としてBeforeまたはAfterのいずれかを指定することができますが、その両方を省略した場合は、新規ブックが自動的に作成され、シートはそのブック内にコピーされるようになっています。

マクロの記録は便利な面もある一方、記録されたままでは意味が分からないことや、そのまま実行すると動かないことも少なくありません。記録結果はヘルプ、Web、参考書などで再度正確な意味を調べてからプログラムの中で利用しておくと、次回以降のプログラミングに役立つことが多いように思います。
posted by Three bit com at 10:00| Excel(エクセル)

2008年12月05日

Excel VBA と Access VBAの違い

最近のVBA関連のセミナーでExcel VBAとAccess VBAの違いを質問されることが増えてきました。
両者を連携させた簡易システムの構築をしている企業が増えてきたためでしょうか。

どちらも同じVBAなのでかなり似ているのではないか、と思われる方が多いようですが、その通りで文法はExcel VBAもAccess VBAも同じです。

いずれか片方のアプリケーションでVBAの基本をマスターしておけば、もう一方のVBAを勉強する際に既知の文法はそのまま活用することができます。

例えば、変数宣言、For、If etcが挙げられます。
両者の違いは、制御する・自動化する対象がExcelか、それともAccessか、という点に出てきます。

例えば、Excelならばセルやワークシートをコントロールする方法を、
Accessならフォームやレポートをコントロールする方法を知っておく必要があります。

普段の業務で使っているExcelの操作とAccessの操作が異なるのと同様に、それぞれ覚えておくべきことが変わります。

またAccessVBAをマスターする上でExcelと異なる大きなポイントの一つが、フォームやレポートのコントロール方法以外に、テーブルやクエリを直接操作するためのADOとDAOにも精通しておく必要があるという点です。

ADOやDAOは熟知しておくと、ExcelとAccessを連携させたシステムやプログラム作成にも役立つ便利なテクノロジーですので、AccessVBAを勉強される方は早い段階でこの両者に触れておくことをお勧めしています。
ちなみにADOは奥が深く高速なため、私も頻繁に利用しています。
posted by Three bit com at 10:00| Excel & Access

2008年12月02日

Format関数とCurrency型

ExcelVBAの入門レベルのセミナーで変数と変数の宣言方法をご説明しています。
単価や合計金額など、金額はCurrency型として定義するのが一般的です。

ところがこれをそのままセルに代入してしまうと、セルの書式が変わってしまうことがあります。
例えば以下のようなプログラムを、書式設定をしていないワークシートに対して実行すると、
セルA1には \100.00 のように\マークだけではなく、小数点以下2桁までが表示されるようになります。


Sub 練習()
  Dim 価格 As Currency
  価格 = 100
  Range("A1").Value = 価格
End Sub


このような動きを回避するには、予めワークシートのセルに書式を設定しておくか、
あるいは
Format関数を使って 価格の値をどのように表示するか定義してからセルに代入すると
期待通りの表示結果になります。


例えば3桁ごとにカンマを表示するだけならば以下のようなFormat関数を作成します。


Sub 練習()
  Dim 価格 As Currency
  価格 = 100
  Range("A1").Value = Format(価格, "#,##0")
End Sub
posted by Three bit com at 10:00| Excel(エクセル)

2008年11月25日

EndキーとEnd()

Excel VBA(エクセル マクロ)では、エクセルのコントロール方法を調べるのに「マクロの記録」という方法があり、セミナーの中でも紹介しています。
リスト内の上下左右の端へカーソルをジャンプさせる動きを調べるには、Endキーと相対参照キーを組み合わせて使うと簡単にVBAでの記載方法が分かります。

Excel(エクセル)でリストとは、1行目にフィールド名が並び1行目以降がデータ(レコード)になっている表のことを言いますが、この表内にカーソルを合わせて Endキーを押してから方向キー(↑↓← →)の1つを押すと、押した方向の最終データにカーソルがジャンプします。
(ショートカットキーはCtrl+方向キーです。)

これをマクロの記録中で、相対参照ボタンをOnにした状態で操作すると、

Selection.End(xlDown).Select

のように記録されます。
xlDown とは Ctrl+↓ を押した場合の動きと同じになります。
Excel(エクセル)の操作では勿論ですが、ExcelVBAでプログラムを書く際にも
セルの位置指定や移動、あるいは範囲指定方法を調べるヒントにになります。
posted by Three bit com at 10:00| Excel(エクセル)

2008年11月18日

文字列演算子 &

Excel(エクセル)のセルに入力する式内にも、Excel(エクセル)VBA(マクロ)のプログラム内にも記載できる &演算子があります。
簡単で便利なのでセミナーで式を作成するときに何気なく使っていると、使い方についてご質問を頂くことがあります。

& は文字列を結合して表示するときに使う演算子です。
例えば以下のようにA1に"東京"、B1に"花子" というデータが入力されている場合に、

C1に =A1&B1 という式を入力すると C1には "東京花子"という文字が表示されます。

-----------------------------
 A1  |  B1  |  C1
-----------------------------
東京    花子    東京花子

C1に入力する式を =A1&B1&"さん" と、修正すると以下のように表示が変わります。 
(式中に文字列を入力するときは "" ダブルクォーテーションで囲むというルールがあります。)

-----------------------------
 A1  |  B1  |  C1
-----------------------------
東京    花子    東京花子さん

この使い方をうまく応用しVLOOKUP関数と組み合わせると、複雑なデータのマッチングを行う際にも、ややこしいマクロ(VBA)を作成しなくてもよいことがあります。

またAccess(アクセス)のクロス集計クエリにも応用することができます。
posted by Three bit com at 10:00| Excel(エクセル)

2008年11月12日

テーブル名、フィールド名

Access(アクセス)のテーブル名、フィールド名、あるいはクエリ・フォーム・レポート・テキストボックスを初めとする各種コントロールの名前にスペースやハイフン(-)が入っているケースをよく拝見します。
例えば、受注テーブルに 顧客コード と 取引先コード を含める目的で

顧客 コード と 取引先 コード
あるいは
顧客-コード と 取引先-コード

といった定義をしている場合などがありますが、
空白は2つが別のフィールドであるように見えます。
ハイフンは演算子の一つ、マイナスと同じになります。

そのため上記のように定義してしまうと、これらのフィールドを使ってクエリの演算フィールドを定義したり、 フォームの演算コントロールを作成したり、あるいはマクロやVBAの中でこれらのフィールドをそのまま記載してしまうとトラブルが起きるか、あるいは作成に一手間増えてしまうことがあります。

フィールド名の途中で空白を空けたほうが見やすい場合は、空白の代わりに半角のアンダースコア( _ Shift+ひらがなの「ろ」のキー)を使うことをお薦めしています。

上記の例では 顧客_コード と 取引先_コード のように命名することになります。

英語名を使う場合には、区切りとなる文字に大文字を使用している例をよく拝見します。
アンダースコアの方が見やすければアンダースコアに変えてもよいと思います。

社内あるいは同一部署内では、こうした命名ルールは決めておいた方が、後任に引き継ぐときや、同じシステムに複数の担当者が関わるときにも都合がよいと思います。
posted by Three bit com at 10:00| Access(アクセス)

2008年11月07日

RangeのValue

Excel(エクセル)VBAのセミナーで最近よくご質問頂くことの一つにRangeのValueプロパティがあります。
例えば、セルA1に10を入力(代入)する操作をプログラムで書くと

Range("A1").Value = 10 

のように書くことができます。
ですが、実際の現場(職場)の既存のプログラムには上記の Value が省略されていて

Range("A1") = 10 

という記載が多いようです。
いずれの方法でも全く同じ結果になりますので、Valueは省略しても構いません。

Excel(エクセル)はRangeのプロパティの指定を省略すると、自動的にValueを補って解釈してくれます。

プログラムソースに曖昧さを残したくないようでしたらValueを省略せずに記載した方が分かりやすいと思います。
また初めてプログラムを書く方の場合には、Valueは省略しないで書いた方が練習になることと思います。
posted by Three bit com at 10:00| Excel(エクセル)

2008年11月02日

「セミナー季節風」スタート!

ITセミナーでよくご質問頂くことや、IT関連のニュース、あるいは開発などについて、雑感などを記載していきたいと思います。

どうぞよろしくお願いいたします。
posted by Three bit com at 10:00| ITブログ