VBA_Tips

▲戻る

●拙作ソフトVer1.00開発記録        

  • アンケート君 (1995/8)

  • 会計君(1998/8)

  • 名札君(1999/11)

  • スケジュール君(2001/7)

  • スケジュール君_Lite(2002/2)

●名札君のVBA



 会計君、アンケート君、スケジュール君およびスケジュール君_Liteは、誤動作防止の観点から、シートおよびマクロにパスワードを設定しました。いずれ皆様に育てていただいて動作が安定したときはすべて皆様の参考に供するつもりです。
 名札君は、誤動作の心配がほとんどないことから、シートおよびマクロのすべてにパスワードは設定していません
 日だまりのVBAの使い方等を見て、皆様からご指導を賜り、それを会計君、アンケート君、スケジュール君およびスケジュール君_Liteに活かして行きたいと考えていますので、どうぞよろしくお願いいたします。

●会計君、アンケート君、名札君、スケジュール君およびスケジュール君_LiteのVBA_Tips


 会計君、アンケート君、名札君、スケジュール君およびスケジュール君_Liteで使っているVBAのいくつかを書き留めてみました。

VBA_Tips目次

  1. 画面を更新させない

  2. 有効データの最終行を知る

  3. 指定した位置を表示する

  4. ワークシート関数を使用する

  5. 入力できる項目範囲を制限する

  6. Enter キーを押したときに、どの方向にあるセルがアクティブになるかを設定する。

  7. 既存のブックのデータや書式を変更する

  8. セルの値を検索値から取得する

  9. 切り取り操作を禁止する(「切り取り、ドラッグアンドドロッ
    プは実施できない」が「コピー、貼り付け操作はできる」)
  10. ユーザフォーム内で使用しているテキストボックスで、改行させるには

  • 画面を更新させない
    処理の過程を表示させずに実行速度を向上させ、画面をちらつかせないようにします。
    '画面を更新させない
    Application.ScreenUpdating = False
           :
           : ← 処理
           :
    '画面を更新する
    Application.ScreenUpdating = True

  • 有効データの最終行を知る
    データを処理する時に、有効データの最終行を知る必要があり、次の3つの方法を使い分けています。
    ここで、16384の数値はExcelのワークシートの行数でバージョンにより32768 行、65536 行になります。
    (1) セル範囲の行数から
    'データの最終行
    Worksheets("シート名").Range("A2").CurrentRegion.Rows.Count
     ※シートが保護されているときは使えません
    (2) 下方向の指定で
    'データの最終行
    Worksheets("シート名").Range("A16384").End(xlDown).Select 
    MsgBox Selection.Row:
     ※行が飛んでいる(データの全くない行がある)時は使えません
    (3) 上方向の指定で
    'データの最終行
    Worksheets("シート名").Range("A16384").End(xlUp).Select 
    MsgBox Selection.Row

    (4) 最終行と最終列を
    Sub 最終行と列()
        Dim 最終行 As Range, 最終列 As Range
        Set 最終行 = Cells.Find("*", , , , xlByRows, xlPrevious)
        Set 最終列 = Cells.Find("*", , , , xlByColumns, xlPrevious)
        MsgBox 最終行.Row '最終行
        MsgBox 最終列.Column '最終列
        Set 最終行 = Nothing: Set 最終列 = Nothing
    End Sub

                       ▲VBA_Tips目次へ戻る

  • 指定した位置を表示する
    スクロールしないと表示されない位置にあるセルを表示させるため、画面の左の最上部に表示させるセルを指定します。
    Application.Goto Reference:=Worksheets("シート名").Range("BB322"), Scroll:=True

  • ワークシート関数を使用する
    Excelには豊富なワークシート関数が揃っています。VBAでこれを使わない手はありません。

    '最小と合計の例
    Dim myRange As Range

    Set myRange = Worksheets("シート名").Range("B:B")
    MsgBox Application.WorksheetFunction.Min(myRange)

    Set myRange = Worksheets("シート名").Range("B1:B15")
    MsgBox Application.WorksheetFunction.Sum(myRange)

    'カウントの例(変数定義を行わない場合の例)
    MsgBox Application.WorksheetFunction.CountIf(Worksheets("シート名").Range("AX2:AX1044"), 1)

    なお、WorksheetFunctionオブジェクトを介さないでも同様の結果が表示されます。
    MsgBox Application.Max(Range("シート名!B:B"))
    MsgBox Application.Sum(Range("シート名!B1:B15"))

                       ▲VBA_Tips目次へ戻る

  • 入力できる項目範囲を制限する
    スクロール範囲を「入力項目セル範囲」(名前が定義されたセル範囲)に限定後、ロックが解除されたセルしか選択できないようにし、ワークシートを保護します。
    '入力項目範囲を制限する
    With ActiveSheet
        .ScrollArea = "入力項目セル範囲"
        .EnableSelection = xlUnlockedCells
        .Protect UserInterfaceOnly:=True
    End With
      ※入力するセルのロックを解除しておきます。

  • Enter キーを押したときに、どの方向にあるセルがアクティブになるかを設定する。
    'Enter キーを押したときに、右方向にあるセルがアクティブ
    Application.MoveAfterReturn = True
    Application.MoveAfterReturnDirection = xlToRight

      ※xlToLeft、xlToRight、xlUp、xlDownを使い分けてください。

                       ▲VBA_Tips目次へ戻る

  • 既存のブックのデータや書式を変更する
    既存のブックを開いた後、変更するマクロを記述した△△△.xlsをマクロを有効にして開くと、処理を実行して△△△.xlsは自動的に閉じ、既存のブックが残ります。
    Sub Auto_Open()
      Workbooks(1).Activate
      Application.Run "△△△.xls!○△○△"
      Workbooks("△△△.XLS").Close SaveChanges:=False
    End Sub
    Sub ○△○△()
      :処理
    End Sub
                       ▲VBA_Tips目次へ戻る

  • セルの値を検索値から取得する
    Dim 検索値 As String
    Dim 検索結果 As Range ' 検索結果を格納するオブジェクト
    Dim 検索結果_値1 As String ' D列
    Dim 検索結果_値2 As String ' E列

    検索値 = "検索データ"
    Worksheets("シート名").Activate
    Set 検索結果 = Range("H2:H200").Find(検索値, LookIn:=xlValues)
    If Not 検索結果 Is Nothing Then
        検索結果_値1 = Cells(検索結果.Row, 4)
        検索結果_値2 = Cells(検索結果.Row, 5)
    End If
                       ▲VBA_Tips目次へ戻る

  • 切り取り操作を禁止する(「切り取り、ドラッグアンドドロップは実施できない」が「コピー、貼り付け操作はできる」)
    メニュー、キーボード、ボタン からの切り取り操作を無効にする。
    「Worksheet」 の 「SelectionChange」プロシージャに
    If (Application.CutCopyMode = xlCut) Then
        MsgBox "データを切り取って、貼り付けはできませ  ん。", , "切り取り無効"
        Application.CutCopyMode = False
    End If
    ドラッグアンドドロップ操作をできないようにする。
    「Workbook」の「WindowActivate」プロシージャに
    Application.CellDragAndDrop = False
    「Workbook」の「WindowDeactivate」プロシージャに
    Application.CellDragAndDrop = True
                        ▲VBA_Tips目次へ戻る

  • ユーザフォーム内で使用しているテキストボックスで、改行させるには
    MultiLineプロパティをTrueにする。 
    Shift+Enter または Ctrl+Enter で改行出来る。 
    もし、Enterのみで改行したいのならば、EnterKeyBehaviorプロパティをTrueにする。 
    この方法だとEnterでの次のコントロールに移る事は出来ない。             
                                          ▲VBA_Tips目次へ戻る




 エクセルによる業務システムを作る場合の考え方については、従来は対立する次の2つの考え方があったようです。
 ①ワークシート上で出来ることは、出来るだけワークシートで行い、VBAでの処理は極力少なくする。
 ②ワークシートはデータファイルや印刷、表示用フォームに限定し、データ処理はVBAですべて処理する。
 しかし、Excel 2000から採用されたモードレスなユーザーフォームの使用が可能となったことで、劇的な作業効率のアップが図られるとともに、①と②の議論が無意味となってしまうことになりました。
 モードレスなユーザーフォームの機能を使うとユーザーフォームを表示しながらアプリケーションの他の部分の操作を行なうことができるモードレスな状態になります。ユーザーフォームを表示したまま選択しているセルの範囲や内容を変更したり、2つ以上のフォームを同時に表示して切り替えながら使用する、といったことが可能となり、非常にスムーズに入力作業を行なうことができるようになりました。つまり、システムに最も適した方法が採用できることになりました。

●日だまりの購入したExcel関連書籍一覧

 Excel関連書籍を紹介して欲しいとのメールを数多くいただきます。しかし、私には非常に多くの書籍の中から適当なものを選択してご紹介するほどの知識はありません。そこで、私が購入した書籍のリストを参考までに以下に提示させていただきます。
書籍名

 発行所

発行日 定価
Excel5.0「基本操作&関数編」
(エーアイムック113)

エーアイ出版

1994/10/25 1,980円
(税込)
Excel5.0「マクロ・モジュール編」
(エーアイムック120)

エーアイ出版

1995/2/25 1,980円
(税込)
Microsoft Excel5.0ビジュアル活用法

日経BP出版センター

1995/5/27 2,900円
(税込)
早わかりExcel Ver.5実用マニュアル

叶V星出版社

1995/6/1 1,800円
(税込)
Excel5.0すぐに使える実用マクロ集
(エーアイムック132)

エーアイ出版

1995/8/25 1,980円
(税込)
Microsoft Office VBA活用ガイド 葛Z術評論社 1995/9/1 2,400円
(税込)
Excel97活用事例集

葛Z術評論社

1997/9/1 2,480円
(税別)
Excel97実践プログラミング
−売上管理システムを考える−

オーム社開発局

1997/9/24 2,700円
(税別)
Excel97VBAによる販売管理

葛Z術評論社

1999/6/25 2,980円
(税別)
Office プログラミング マガジン
 vol.01
翫ト泳社出版局 1999/11/1 1,380円
(税込)
すぐに使えるExcel VBA 業務処理テンプレート ソフトバンク パブリッシング 2001/3/23 2,800円
(税別)

 

▲戻る