[[20140610175448]] 『解説してください』(素人) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『解説してください』(素人)

こちらで見つけたマクロを流用したいと思いましたが、素人のため何となくしか
内容が読み取れず、どこを変更していいかがいまいちわかりません。
解説を付けていただけませんか?('先週データ範囲など、どの部分がどう動くか的な)
流用したいマクロは[[20110104170754]]です。

  Sub test()
  Dim myRng1 As Range, myRng2 As Range
  Dim tbl1 As Variant, tbl2 As Variant
  Dim i As Long, j As Long, myRow As Long

  Set myRng1 = Worksheets("Sheet1").Range("A1").CurrentRegion '先週データ範囲
  Set myRng2 = Worksheets("Sheet2").Range("A1").CurrentRegion '今週データ範囲

  tbl1 = myRng1.Value
  tbl2 = myRng2.Value
  For i = 1 To UBound(tbl2)
    myRow = 0
    On Error Resume Next
    With Application.WorksheetFunction
      myRow = .Match(tbl2(i, 4), .Index(tbl1, 0, 4), 0)
    End With
    On Error GoTo 0
    If myRow = 0 Then
      myRng2.Rows(i).Interior.ColorIndex = 8
    Else
      For j = 1 To 26
        If tbl1(myRow, j) <> tbl2(i, j) Then
          myRng2.Cells(i, j).Interior.ColorIndex = 6
        End If
      Next j
    End If
  Next i
  End Sub 

< 使用 Excel:unknown、使用 OS:unknown >


 ざっと見た感じ二つのシートのA:Zの範囲を比較して違っている部分に色をつけている
 ようですけれど、何を変更したいのかを説明してください。

 そうでないとどこを説明してよいかがわかりませんので。
(Mook) 2014/06/10(火) 19:37

上記のマクロでマッチングはできますか?
流用して以下のようなマクロを作成できるかおしえてください。

Eファイルに上記のマクロをセットし、マッチングができるのであれば
BファイルとCファイルのB列でマッチングをし、一致したら行を見に行く
ようにし、違うところは色付けをする。

Aフォルダ
├Bファイル・Cファイル

Dフォルダ
├Eファイル

(素人) 2014/06/11(水) 11:32


 これはまたずいぶんと飛躍しましたね。

 >こちらで見つけたマクロを流用したいと思いましたが
 というレベルの変更ではないように思います。

 マッチングの内容が不明瞭ですが、単にあるか無いかの比較であれば、作業列をおき
 COUNTIF 等で対応シートでの有無を確認するくらいが手っ取り早いと思います。

 懐かしいmomoさんの回答だったのでコメントしましたが、別の案件になりそうなので
 マクロでの実現を希望する場合は他の方の回答をお待ちください。

 個人的な感想なので強制でも何でもありませんが、
 ニックネームは匿名ではない名前が良いかと思います。
(Mook) 2014/06/11(水) 13:06

 二つのブックが決まっているなら
 単純に
  Set myRng1 = Worksheets("Sheet1").Range("A1").CurrentRegion '先週データ範囲
 の所でブック名も含めた範囲を指定してはどうでしょう?

 今はブック名が省略されているので、アクティブブックの Sheet1とSheet2の範囲になっています。
  
(HANA) 2014/06/12(木) 11:54

(HANA)様、説明不足ですいませんが、Eファイルに、BファイルのシートとCファイルのシートを
コピーしてくるマクロは自分なりに見よう見まねで作成しました。
あとは、Eファイルの中で、BファイルとCファイルのB列をマッチングしていくところからのマクロが
作成できません。
BファイルとCファイルのB列の並びが規則的ではなく、行数も変動するため、マッチングがが必要かと
考えています。
お手すきでしたら、教えていただきたく思います。
おねがいします。

Aフォルダ
├Bファイル・Cファイル

Dフォルダ
├Eファイル

(素人) 2014/06/12(木) 17:00


 Eファイルに二つのシートをコピーできたなら
 後は 過去ログのコードから マッチングの列番号を変更するだけですよね?

      myRow = .Match(tbl2(i, 4), .Index(tbl1, 0, 4), 0)
 この部分で、4列目・・・D列・・・でマッチングしてますが
 B列であれば 二ヶ所の「4」を「2」に変更で出来ませんか?

 それから
      For j = 1 To 26
 で、26列目・・・Z列・・・まで照合を行っていますが
 表が26列目までない場合は、この部分も適宜変更して下さい。

 また、Mookさんが書いておられますが
 >個人的な感想なので強制でも何でもありませんが、
 >ニックネームは匿名ではない名前が良いかと思います。
 私もその様に思います。

 この手の掲示板には (素人)さんはたくさんおられますので。
   
(HANA) 2014/06/12(木) 17:19

ニックネームについてご指摘ありがとうございます。
次回から変えるようにします。

この部分を変更してみました。
>myRow = .Match(tbl2(i, 4), .Index(tbl1, 0, 4), 0)
> For j = 1 To 26

この部分でエラーになってしまいます。
>For i = 1 To UBound(tbl2)
型が一致しませんとなってしまいます
(素人) 2014/06/12(木) 17:49


 Setのコードのすぐ次に
  MsgBox myRng2.Address
 なんてコードを入れて、実際に表があるセル範囲と一致しているか確認してみて下さい。

 >Set myRng1 = Worksheets("Sheet1").Range("A1").CurrentRegion '先週データ範囲
 となっていますので、表はA1セルから連続した範囲にある必要があります。

 表がA1セルに隣接していない範囲にある(A2,B1,B2セルが未入力)場合は
 表のある範囲の取得方法も変更の必要が出てくると思います。
  
(HANA) 2014/06/12(木) 21:52

範囲がA6:Z11でした。
>MsgBox myRng2.Address

("A1")の部分を修正してみました。
>Set myRng1 = Worksheets("Sheet1").Range("A6").CurrentRegion

ここでエラーがでます。(インデックスが有効範囲にありません。)
>If tbl1(myRow, j) <> tbl2(i, j) Then

よろしくおねがいします。
(素人) 2014/06/13(金) 10:26


 ローカルウィンドウを表示させて
 エラーが出る時に myRow,j,i のそれぞれの値を確認して下さい。

 また、tbl1,tbl2の大きさが、myRow,j,i に収まっているか確認して下さい。

 「型」の列に Variant/Variant(1 to 6, 1 to 26) の様に書かれていると思います。
 myRow,i が、 前側の 1 to 6 の範囲内の値か?
 j が、後ろ側の 1 to 26 の範囲内の値か?

 この範囲外の位置を見に行かせようとすると
 >インデックスが有効範囲にありません。
 のメッセージがでます。

 なぜ範囲外になってしまうのか、原因を突き止める必要があると思います。

 もしかしたら、表が1行目から始まっていないためかもしれません。
 そのあたりも含めて、確認してみて下さい。

 別件(もう少し後の話)になりますが、セルに色を付ける部分は
 表の開始位置がずれている分、ずらさないといけないです。
  
(HANA) 2014/06/13(金) 10:51

値とはこれであっていますか…?
(j=3) (i=1)
>myRow,j,i のそれぞれの値を確認して下さい

確認?どこをみたらよいのですか…?
>tbl1,tbl2の大きさが、myRow,j,i に収まっているか確認して下さい。

表はA6から始まっています。表の上の行にはタイトルなどはいっているので
行の削除ができないのですが...
>もしかしたら、表が1行目から始まっていないためかもしれません。

ありがとうございます。
>セルに色を付ける部分は表の開始位置がずれている分、ずらさないといけないです。

(素人) 2014/06/13(金) 11:13


 tbl1,tbl2の大きさは
 ローカルウィンドウの tbl1 とか tbl2 とかの
 「型」の列です。
 Variant/Variant(1 to 6, 1 to 26) 
 なんてのが書かれていると思います。

 >範囲がA6:Z11でした。 
 と言う事なので、6行26列の表だと思いますが。

 なので、 j=3 , i=1 であれば 3行目の1列目 なので
 範囲に収まっている事になります。

 tbl1の方でエラーなのかな。。。?
  

(HANA) 2014/06/13(金) 11:41


tbl1、tbl2の型?を見ると
tbl1 = myRng1.Value に対してはなにもでないですが、
tbl2 = myRng2.Value に対しては
tbl2 = myRng2.Value=オブジェクト変数またはWithブロック変数が設定されていません
というふうになり、Variant/Variant(1 to 6, 1 to 26)がでてきません
>Variant/Variant(1 to 6, 1 to 26)なんてのが書かれていると思います。

For i = 1 To UBound(tbl2)
UBound(tbl2)=型が一致しません となります

myRow = .Match(tbl2(i, 4), .Index(tbl1, 0, 4), 0)
tbl2(i, 4)=型が一致しません となります

If tbl1(myRow, j) <> tbl2(i, j) Then
tbl1(myRow, j)=型が一致しません となります
tbl2(i, j)=型が一致しません となります

よろしくおねがいします

(素人) 2014/06/13(金) 12:04


 >tbl1 = myRng1.Value に対してはなにもでないですが、 
 ってどういう事ですか?

 それ以降に関しても、何のご説明なのか よくわかりません。

 >ここでエラーがでます。(インデックスが有効範囲にありません。) 
 >>If tbl1(myRow, j) <> tbl2(i, j) Then 
 じゃなかったんですか?
  
(HANA) 2014/06/13(金) 13:22

素人なため型の見方?がよくわからなかったのですが、
Variant/Variant(1 to 6, 1 to 26)このような型?が見当たらなかったです。
>tbl1,tbl2の大きさはローカルウィンドウの tbl1 とか tbl2 とかの「型」の列です。
Variant/Variant(1 to 6, 1 to 26) なんてのが書かれていると思います。

先ほど記載したもの(以下参照)は、コードの上にカーソルを持っていくと、
現れた内容を載せました。
For i = 1 To UBound(tbl2)
UBound(tbl2)=型が一致しません となります

myRow = .Match(tbl2(i, 4), .Index(tbl1, 0, 4), 0)
tbl2(i, 4)=型が一致しません となります

If tbl1(myRow, j) <> tbl2(i, j) Then
tbl1(myRow, j)=型が一致しません となります
tbl2(i, j)=型が一致しません となります

(素人) 2014/06/13(金) 14:05


 ローカルウィンドウは表示できていますか?

 他サイトですが。
http://excelvba.pc-users.net/fol8/8_2.html

 そのウィンドウの一番上の灰色の部分に
  式     値       型
 と書いてありませんか?

 文字だけのやり取りになるので なかなか伝わりにくいと思いますが
 我慢しておつきあいください。
  
(HANA) 2014/06/13(金) 14:29

こちらこそお付き合いいただきとても感謝しております。

恥ずかしながら、ローカルウィンドウの表示方法を初めて知りました。
教えていただいた方法で出てきた型は以下です。
よろしくおねがいします。

  : myRng1 : Nothing : Range
  : myRng2 : Nothing : Range
  : tbl1 : Empty 値 : Variant/Empty
  : tbl2 : Empty 値 : Variant/Empty
  : i : 0 : Long
  : j : 0 : Long
  : myRow : 0 : Long
(素人) 2014/06/13(金) 14:51

 えっと、エラーになって止まった時に その状態ですか?

 たとえば
  : myRng1 : Nothing : Range
 って事は
 Set myRng1 = Worksheets("Sheet1").Range("A1").CurrentRegion 
 で、Setされてない・・・Notingなので・・・って事です。

 でも
 >>MsgBox myRng2.Address
 >範囲がA6:Z11でした。 
 は、確認出来てるんですよね?

 myRng2だけでなく、myRng1の方も確認してみて下さい。
  
(HANA) 2014/06/13(金) 15:04

すみません。
エラーが出たときは以下になります。

+ : myRng1 : : Range/Range
+ : myRng2 : : Range/Range
+ : tbl1 : : Variant/Variant(1 to 6, 1 to 26)
+ : tbl2 : : Variant/Variant(1 to 6, 1 to 26)

  : i : 1 : Long
  : j : 27 : Long
  : myRow : 1 : Long

(素人) 2014/06/13(金) 15:17


 jが「27」になってますね。

 tbl1 も tbl2 も 26列の範囲しかないですよね。

 >>tbl1,tbl2の大きさが、myRow,j,i に収まっているか確認して下さい。
 の結果としては、 jが収まってない事になります。

 なので
 >この範囲外の位置を見に行かせようとすると
 >>インデックスが有効範囲にありません。
 >のメッセージがでます。

 でも
 > For j = 1 To 26 
 なので、jは26までにしかなれないと思います。

 なぜ j が 27 まで行ってしまうのか
 コードを見直してみて下さい。
  
(HANA) 2014/06/13(金) 15:28

数値が27になっていたため、お手数をおかけしました。
> For j = 1 To 26

エラーはでなくなりました。

>セルに色を付ける部分は表の開始位置がずれている分、ずらさないといけないです。
この部分についてお付き合いをお願いします。

(素人) 2014/06/13(金) 16:09


 >>セルに色を付ける部分は表の開始位置がずれている分、ずらさないといけないです。
 って書きましたが、そのままでも大丈夫な気がして来ました。

 >この部分についてお付き合いをお願いします。 
 となってますが、もう一度  本当にずれているか  確認お願いします。
  
(HANA)

マクロを実行したところ、A7:Z7とA11:Z11に水色の塗りつぶしがされました。

現在目視で確認しているのですが、他にも二つのシートで違いのあるセルがあり、
そこは塗りつぶされていません。

なぜでしょうか…?
(素人) 2014/06/13(金) 17:53


 マクロを実行する時に[ステップイン(S)]を選んで実行して下さい。

 [F8]を押す毎に、コードが一行ずつ実行されます。

 A7:Z7に相当するループの時の
 myRow や tbl1(myRow, j) や tbl2(i, j) が
 想定しているものと一致するか、確認してみて下さい。
  
(HANA) 2014/06/19(木) 08:59

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.