VBAプログラミング日記(Access)

1 各フォームの同じ機能のボタンの処理を共通化したい

 

clsButtonProcessing(クラスモジュール)

Option Compare Database

Option Explicit

Private WithEvents btn As CommandButton

Public Property Let Button(ByVal obj As CommandButton)

    Set btn = obj

    btn.OnClick = “[EVENT PROCEDURE]”  

→ ①Onのついたイベントを選ぶ

       ②[EVENT PROCEDURE]を記載

End Property

Private Sub btn_Click()

 ここにボタンをクリックしたときの処理を記載

    MsgBox btn.Caption など

 ちなみに使用中のフォームは、Screen.ActiveForm.Nameで特定できる。

End Sub

各フォームに記載

Private cls() As New clsButtonProcessing

Private Sub Form_Load()

    Dim c As Object

    ReDim cls(0)

    For Each c In Me.Controls

        If TypeName(c) = “CommandButton” Then

            ReDim Preserve cls(UBound(cls) + 1)

            cls(UBound(cls)).Button = c

        End If

    Next c

End Sub

VBAプログラミング日記(Excel)

1 クラスモジュールを使ってボタンの処理を共通化する

やりたいこと。ワークブックの各シートやユーザーフォームのコマンドボタンで機能が同じものには、記述を1つだけで処理の共通化をさせたい。

例 シート1、シート2、シート3があり、それぞれボタン1、ボタン2があるとする。

clsButtonProcessing(クラスモジュール)

Option Explicit

Private WithEvents btn As MSForms.CommandButton

Public Property Let Button(ByVal obj As MSForms.CommandButton)

    Set btn = obj

End Property

Private Sub btn_Click()

    Select Case btn.Name

        Case “CommandButton1”

            MsgBox “ボタン1”

        Case “CommandButton2”

            MsgBox “ボタン2”

    End Select

End Sub

各シートのコマンドボタンを指定する。

標準モジュール

Option Explicit

Private cls() As New clsButtonProcessing  → 動的配列

Public Sub startClass()

    Dim ws As Worksheet

    Dim obj As OLEObject

    ReDim cls(0)

    For Each ws In ThisWorkbook.Sheets

        For Each obj In ws.OLEObjects

            If obj.progID = “Forms.CommandButton.1” Then

                ReDim Preserve cls(UBound(cls) + 1)

                cls(UBound(cls)).Button = obj.Object  → Object指定

            End If

        Next obj

    Next ws

End Sub

各フォームのコマンドボタンを指定する

Private cls() As New clsButtonProcessing

Private Sub UserForm_Initialize()

    Dim c As Control

    ReDim cls(0)

    For Each c In Me.Controls

        If TypeName(c) = “CommandButton” Then  → TypeName関数を使用

            ReDim Preserve cls(UBound(cls) + 1)

            cls(UBound(cls)).Button = c

        End If

    Next c End Sub

VBAプログラミング日記

1 テキストファイルの読み込みについて

 ①1行ずつ読み込むときは、

  Open ファイル名 For Input  As #ファイル番号

  Do EOF(ファイル番号)

    Line Input #ファイル番号 , buf

  Loop

 ②全部を読み込むときは、

   Open ファイル名 For Binary As #ファイル番号

   buf=Space(FileLen(ファイル名)) ’//ファイルに含まれる総文字数の確保

   Get #ファイル番号 , , buf

 ③10行のテキストファイルがあり、11行目に改行コードの有無による処理の検証結果

  1行ずつ読み込んだときは10行として処理できる。

  全部を読み込んでSplit(buf,vbCrlf)を使用して処理したときに

  For i=Lbound(配列) to Ubound(配列)

  で処理を行うと、11行目に改行コードがないときは1行ずつ読み込んだときに同じ。Ubound(配列)は要素9

  11行目に改行コードあるときはUbound(配列)は要素10になり配列(10)は空文字のみとなる。

 ・考えられる対処方法

  For i=Lbound(配列) to Ubound(配列) – 1

で処理した後に配列(最大添え字)に対して処理を行う。