私は、Excel ブックの各シートが、私が書いていたモジュールのインスタンスを使用するという仮定の下で、プロジェクトにかなりの時間を費やしてきました。すべて同じテンプレートの複数のシートがありますが、シートは保存されているデータのタイプに固有です。モジュールにはセッターとゲッターがありますが、特定のシートのゲッターは、同じシート(モジュールのインスタンス)のセッターによって設定された変数にのみアクセスすることを期待していました。結局のところ、すべてのシートがモジュールの同じインスタンスを使用しており、セッターが互いにオーバーライドしているため、モジュールによって計算された正確な結果を持つシートは 1 つだけです。TMI には入りたくありませんが、セッターは、ゲッターによって提供される生データをフォーマットするために使用されるデータを提供します。すべてのシートをコード化することなく、各シートにモジュールのインスタンスを持たせる方法はありますか。つまり、オペレーターが保存および処理する新しい一連の結果を持っている場合、オペレーターはそのシートを Excel にコピーし、その新しいシートにデータを配置するだけです。オペレーターがコードを変更する必要はありません。私はこれを説明しようとしましたが、適切に説明できたかどうか確信が持てません。モジュールの個別のインスタンスを作成する方法はありますか?
質問する
137 次
2 に答える
4
モジュールだけでなく、クラス モジュールを使用してこれを行うことができます。1 つの違いは、クラスと同じ型として各ワークシートにオブジェクトを作成する必要がありますが、毎回オブジェクトの個別のインスタンスをインスタンス化する必要があることです。
このクラスのスコープ方法 (Dim を使用) に応じて、どこで使用できるかが決まります。
これはかなり良いリファレンスです: http://www.cpearson.com/excel/classes.aspx
于 2013-08-21T21:02:59.370 に答える
1
同じ「タイプ」(同じ種類のデータとレイアウトなど) の複数のワークシートがある場合、(ここで他の人が提案しているように) 良いアプローチは、シートを「管理」するコードをクラス モジュールに配置することです。特定のワークシート (アクティブシートまたは現在作業中のシート) への参照を保持できるそのクラスのプロパティ。
例:clsSheet
特定のセルにマップされる単一の「タイトル」プロパティを持つ単純なクラス:
Option Explicit
Private m_sht As Worksheet
Public Sub Init(sht As Worksheet)
Set m_sht = sht
End Sub
Public Property Let Title(t As String)
m_sht.Range("A1").Value = t
End Property
Public Property Get Title() As String
Title = m_sht.Range("A1").Value
End Property
使用法:
Dim shtObj as New clsSheet
shtObj.Init ActiveSheet
shtObj.Title = "my title"
msgbox shtObj.Title
既存のコードは、新しいクラス モジュールにかなり簡単にマップされる可能性があります。Ranges などを操作する場合m_sht
は、(たとえば) の代わりに必ず参照する必要があります。ActiveSheet
于 2013-08-21T23:17:18.843 に答える