いつCallを使うの?

エクセルのVBAの話し。

関数の戻り値がいらない時に「変数=関数名(引数1,引数2)」の「変数=」をCallに変える。

戻り値が要らないなら()は不要。でも、()の削除は面倒。

なら「変数=」をCallに変える。戻り値が必要になったらCallを変数=に変えるだけ。

RubyやVBAは()を強要しないから好き。

カテゴリー: Excel章立て | コメントする

名前の活用 Names

Excelでは、セル番号A1を”入学日”という文字列でA1の値を扱うことができる。例えば、Range(“A1”)をRange(“入学日”)と書く。セルの名前は、そのワークブック(Excelのファイル)内ならワークシート名を指定する必要は無い(スコープ/有効範囲はExcelのワークブック。別のワークブック/xlsファイルならワークブック名を指定すれば使える。)

セル番号をセルの名前にすることでプログラムコードに意味を付けることができる。プログラムの変数名のように使える。

ワークシート関数でセル内に数式を書く場合は、セルのアドレス同様、名前がそのまま使える。

コードを書く時は、名前リストで確認しながら該当の名前を使う。セル番号を変数のように使え、しかも見えるためプログラムが読みやすくなる。セルに入れることができるデータは浮動小数点Doubleと文字列ですのでほぼバリアント型のような変数として扱えます。

これらの名前をExcelではセルを変数のように使える。しかし、コードではRange(“講師氏名”)のように””が入れる必要がある。これは仕方がない。

カテゴリー: 12 ExcelのVBAを快適に使うためのアイデア <E> | コメントする

関数やマクロで使う便利アイデア一覧

この章では、便利な機能を説明する。

  1. 変数のように使えるExcelの名前
  2. データベースとして使えるテーブル
  3. VBAなしで作れる入力用フォーム
  4. カメラでセル結合を使わない
  5. ワークシート名や名前、表の項目名の変化をチェックする仕組
  6. 入力の補完。コードの名前とExcelの名前の分離
  7. 標準モジュールやクラスモジュールを複数のExcelファイルから使う手法
  8. アドインの利用

コードを書く時に変数名、セル名、ワークシート名、テーブル名、テーブルの項目名など多くの名前を使う。コードになるべく固有の名前が入ると読みやすくなるが、名前の変更があると正しく動作いない。また、名前が多すぎると入力のテンポが落ちる。

カテゴリー: 12 ExcelのVBAを快適に使うためのアイデア <E> | コメントする

3/2の入力を次年度の入力にする

イベントの活用例です。

セルに年を入れず、「月/日」形式で入力した場合、年を省略しているためその年の月日になる。例えば、今年が2000年の場合「2/3」とセルに入力すると「2000/2/3」になる。年度で入力したい場合は、1月から3月までは次の年になるように、イベントプロシージャを設定する。

Private Sub Worksheet_Change(ByVal Target As Range)
    If IsDate(Target.Value) Then
        Debug.Print "日付だ"
        Select Case Month(Target.Value)
            Case 1, 2, 3
                Excel.Application.EnableEvents = False '次行でWorksheet_Changeイベントが何度も発生しないようにする
                Target = VBA.DateSerial(Year(Target) + 1, Month(Target), Day(Target))
                Excel.Application.EnableEvents = True '解除
        End Select
    End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

は書きません。オブジェクトボックスをWorksheet。プロシージャ/イベントボックスでChangeを選ぶと勝手にモジュールに入る。動画またはこちらで確認下さい。

もう一つ。活用例。

「ぺけ」の形の文字は、いくつかある。これをイベントプロシージャを使って黄色の塗りつぶしのセルで「ぺけ」に似た文字の場合は、半角の小文字のx(エックス)に変える。

x,X,x,X,× 。順に、半角の小文字、半角の大文字、全角の小文字、全角の大文字、乗算記号。

Private Sub Worksheet_Change(ByVal Target As Range)
    If 1 = Len(Target) And Target.Interior.Color = VBA.vbYellow Then '1文字で黄色の塗りつぶしの場合
        Select Case Target
            Case "x", "X", "x", "X", "×"
                Excel.Application.EnableEvents = False
                Target = "X" '半角大文字X
                Excel.Application.EnableEvents = True
            End Select
    End If
End Sub

カテゴリー: 14 イベントの使い方 <VBA> | コメントする

エクセルでBATファイルを作って実行

makeabc.batを例に以下のことを実行します。

  1. VBAのカレントフォルダを変更する(作業フォルダ)
  2. Excelのシートに書いたBATファイルを保存する
  3. 保存したBATファイルを実行する VBA.Shell関数
  4. BATファイルを取り込む、読み込む。書き込み。

なるべくマクロ記録して、修正やイミディエイトで確認しながら作っていきます。コマンドプロンプトの実体cmd.exeやそのexeファイルの中で持っているコマンドcopyやmkdirの話し(cmd.exeが持っている?Excelと対比すると、Exceが持っているコマンドとはメニューのこと)もします。cmd -hも

VBAのMkDirやFileCopy関数でもできますが、VBAの関数の場合は、以下のエラー。「実行時エラー75:パス名が無効です。」翻訳すると「すでに同じフォルダやファイルがありますので作れません。」です。

一方、BAT。つまり、コマンドプロンプトの実行というかcmd.exeのコマンドはエラー無しにできることだけをします。ええ感じです(上書きは注意しないといけまんが)。

カテゴリー: 13 ファイル処理、メモ帳とのデータ処理 | コメントする