0

私は、Excel ブックの各シートが、私が書いていたモジュールのインスタンスを使用するという仮定の下で、プロジェクトにかなりの時間を費やしてきました。すべて同じテンプレートの複数のシートがありますが、シートは保存されているデータのタイプに固有です。モジュールにはセッターとゲッターがありますが、特定のシートのゲッターは、同じシート(モジュールのインスタンス)のセッターによって設定された変数にのみアクセスすることを期待していました。結局のところ、すべてのシートがモジュールの同じインスタンスを使用しており、セッターが互いにオーバーライドしているため、モジュールによって計算された正確な結果を持つシートは 1 つだけです。TMI には入りたくありませんが、セッターは、ゲッターによって提供される生データをフォーマットするために使用されるデータを提供します。すべてのシートをコード化することなく、各シートにモジュールのインスタンスを持たせる方法はありますか。つまり、オペレーターが保存および処理する新しい一連の結果を持っている場合、オペレーターはそのシートを Excel にコピーし、その新しいシートにデータを配置するだけです。オペレーターがコードを変更する必要はありません。私はこれを説明しようとしましたが、適切に説明できたかどうか確信が持てません。モジュールの個別のインスタンスを作成する方法はありますか?

4

2 に答える 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 に答える