|
▼弘美 さん、皆さん、おはようございます。
。
>なぜセルとセルの比較をしたいのかと言うとお仕事で頻繁に皆が共有しているEXCELファイルがあるのですが修正していると他の人が使えなくなるので、そのEXCELファイルを自分のパソコンで修正して共有しているEXCELファイルに上書き保存をしたいのです。
>そうした時単純に上書き保存ができないのです。皆が使っているファイルの内容をその
>共有しているEXCELファイルに反映させなくてはいけないんです。そうした時プログラムを動かして皆が修正したファイルを集めてその内容を共有しているEXCELファイルに反映させそのデータを皆のEXCELファイルに戻す作業をしたいのです。
>こうした時セルとセルの比較が必要になってくるのです。
↑これで、何となくやりたいことは理解できましたが、まだ、何故、「セルとセルの比較」が必要なのかはわかりませんでした。
詳細がわからないので、めったなことは言えませんが、他の方法も検討するということも
残しておいてくださいね。
というのも、セルとセルの弘美 さんのいう全てのプロパティの比較と言うのは、
かなり面倒な処理ですよね?
こんな処理を本当にしなければならないのか?という疑問がどうしても
残ります。
仕様の根本的なところを再度見直す必要は無いか?なんて事を考えてみて下さいね!!
で、それはそれとして・・・・。
>まだサンプルを見てどのように組み込もうかな?と考えている最中です。
>それとこのサンプルの事なのですがあるセルの情報をmesに連結しているのですよね?
>もしそうだとしたら比べたいもう一つのsampu2()を作成してsampu1()で作成したmesとsampu2()で作成したmesを比べればいいのですよね?
MesというString型にしたのは、例としてMsgboxでの表示用文字列を編集するために
使用したものです。簡単な場合なら、これのvbTab やVbcrを除いて連結したものの比較でもよさそうですが、間違いも起こしそうですよ!!
例えば、弘美 さんの例にあった「コメントの有無やその内容」コメントが作成されていなければCommentプロパティでは、Nothingが返ってきます。
こんな場合は、どうするのかとかね!!
投稿したコードは、CallByNameを使用すれば、全てのプロパティを比較するコードより、
少しは簡単になるのではないかと言う例題コードという意味で記述したものです。
CallByNameを使用して、比較するには??でちょっと考えてみました。
前回のコードを少し変更して・・・・。
'======================================================================
Type att
nestcnt As Long
p_type() As Long 'p_nameが0:getメソッド 1:setメソッド _
2:プロパティproperty get 8:オブジェクト
p_name() As String 'プロパティ名
End Type
'======================================================================
Type pr_pack
ret() As Boolean 'true:プロパティを正常に取得 false:プロパティの取得不可
ans() As Variant 'attの配列で取得したプロパティ falseは、の場合は取得不可
End Type
'========================================================================
Sub main()
Dim a1_pr As pr_pack
Dim a2_pr As pr_pack
Dim myPrName(1 To 7) As att
myPrName(1) = set_att(Array(2), Array("numberFormatLocal"))
myPrName(2) = set_att(Array(2), Array("value"))
myPrName(3) = set_att(Array(8, 2), Array("Interior", "colorindex"))
myPrName(4) = set_att(Array(8, 2), Array("Interior", "PatternColorIndex"))
myPrName(5) = set_att(Array(8, 2), Array("Font", "colorindex"))
myPrName(6) = set_att(Array(2), Array("Style"))
myPrName(7) = set_att(Array(8, 8, 8, 1, 2), Array("comment", "shape", "textframe", "characters", "text"))
a1_pr = get_property(Range("a1"), myPrName())
a2_pr = get_property(Range("a2"), myPrName())
ret = 0
For i = 1 To 7
If a1_pr.ret(i) = True And a2_pr.ret(i) = True Then
If a1_pr.ans(i) <> a2_pr.ans(i) Then
MsgBox Join(myPrName(i).p_name(), ".") & "が一致しません"
ret = 1
End If
Else
MsgBox Join(myPrName(i).p_name(), ".") & "が一致しません"
ret = 1
End If
Next
If ret = 0 Then
MsgBox "比較したプロパティは一致します"
End If
End Sub
'==============================================================
Function set_att(type_array, nm_array) As att
'取得したいプロパティ情報をatt属性に設定する
'input : type_array プロパティ(メソッド)のタイプを表すVariantの配列
' nm_array プロパティ(メソッド)の名前をVariantの配列
'output: set_att : get_propertyの入力データとなるatt属性のデータ
With set_att
.nestcnt = UBound(type_array) - LBound(type_array) + 1
ReDim .p_type(1 To .nestcnt)
ReDim .p_name(1 To .nestcnt)
For idx = LBound(type_array) To UBound(type_array)
.p_type(idx + 1) = type_array(idx)
.p_name(idx + 1) = nm_array(idx)
Next
End With
End Function
'====================================================
Function get_property(myRange As Range, nmlst() As att) As pr_pack
'指定されたセルのnmlst()で設定されたプロパティを取得する
'input : myRange : プロパティを取得するセルオブジェクト
' nmlst() : 取得するプロパティ名を含む情報群
'output: get_property---nmlst()に対応したプロパティの値を含むpr_pack属性
Dim idx As Long
Dim jdx As Long
Dim obj As Object
On Error Resume Next
ReDim get_property.ans(1 To (UBound(nmlst()) - LBound(nmlst()) + 1))
ReDim get_property.ret(1 To (UBound(nmlst()) - LBound(nmlst()) + 1))
For idx = LBound(nmlst()) To UBound(nmlst())
Set obj = myRange
get_property.ret(idx) = True
get_property.ans(idx) = Empty
With nmlst(idx)
For jdx = 1 To .nestcnt
Err.Clear
Select Case .p_type(jdx)
Case 0
get_property.ans(idx) = CallByName(obj, .p_name(jdx), VbMethod)
If Err.Number = 0 Then Exit For
Case 1
Set obj = CallByName(obj, .p_name(jdx), VbMethod)
Case 2
get_property.ans(idx) = CallByName(obj, .p_name(jdx), VbGet)
If Err.Number = 0 Then Exit For
Case 8
Set obj = CallByName(obj, .p_name(jdx), VbGet)
End Select
If Err.Number <> 0 Then
get_property.ans(idx) = False
get_property.ret(idx) = False
Exit For
End If
Next jdx
If IsEmpty(get_property.ans(idx)) Then
Set get_property.ans(idx) = obj
End If
End With
Next idx
On Error GoTo 0
End Function
上記のコードのmainでは、アクティブシートのセルA1とA2を7つのプロパティで
比較したものです(一致か不一致のメッセージボックスを表示します)。
但し、まだ、追加コードが必要かもしれませんよ!!
CallByName関数を使用しても結構大変です。
|
|