Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


9562 / 13644 ツリー ←次へ | 前へ→

【26633】表の比較修正 こなつ 05/7/12(火) 16:20 質問[未読]
【26638】Re:表の比較修正 Jaka 05/7/12(火) 17:08 回答[未読]
【26647】Re:表の比較修正 こなつ 05/7/12(火) 18:51 お礼[未読]
【26660】Re:表の比較修正 Jaka 05/7/13(水) 10:47 回答[未読]
【26671】Re:表の比較修正 こなつ 05/7/13(水) 18:29 お礼[未読]

【26633】表の比較修正
質問  こなつ  - 05/7/12(火) 16:20 -

引用なし
パスワード
   以前、同じような質問がありましたが
少し出来ない点があって再度質問させていただきました。
どなたかご教授して下さい。宜しくお願いします。

 Sheet1(メイン)
   A      B        C      D⇒⇒⇒⇒⇒⇒⇒⇒
1  ID   名前     コメント  データ 
2 1010  たまご    目玉焼き  30個
3 1020  きゅうり    漬物    15本
4 1030  レタス     サラダ    3個
5 1040  たまねぎ   天ぷら    6個
6 1050  にんじん    カレー   10本 
7 1060  じゃがいも   カレー   20個

 Sheet2(修正)
   A      B        C      D⇒⇒⇒⇒⇒⇒⇒⇒
1  ID   名前     コメント   
2 1010  たまご    目玉焼き  
3 1020  きゅうり    サラダ    
4 1021  かぼちゃ   天ぷら   
5 1030  レタス     サラダ   
6 1031  ピーマン   焼肉 
7 1032  レンコン    煮物
8 1040  たまねぎ   天ぷら    
9 1060  じゃがいも   カレー   
10 1070  ねぎ      薬味

 以上のようなメインの表と修正する表があります。
 (修正表は別のソフトからエクセルファイルとして
  アウトプットされます)
 メインの表には 修正表+いろいろなデータが入っており
 この表を比較して、メインの表を変更(増減)していきたい
 のですが、(下のイメージをつくりたいのですが)

 Sheet1(メイン)
   A      B        C      D⇒⇒⇒⇒⇒⇒⇒⇒
1  ID   名前     コメント  データ 
2 1010  たまご    目玉焼き  30個
3 1020  きゅうり    サラダ   15本
4 1021  かぼちゃ   天ぷら
5 1030  レタス     サラダ    3個
6 1031  ピーマン   焼肉 
7 1032  レンコン    煮物
8 1040  たまねぎ   天ぷら    6個
9 1060  じゃがいも   カレー   20個
10 1070  ねぎ      薬味

 現在は修正表が変わるとメインの表と比較しながら手作業で
 コピーしています。f(^^;)

 条件
  修正表は上の例のように増えたり・減ったりします。
  また、同じIDでも一部修正がかかったりもします。
 
  メインの表はデータ数約2000行×30桁程度の表です
  修正表も約2000行×20桁程度です。

  修正結果はメインの表に反映させたいです。

以上、長々と書いてしまいましたが、宜しくお願いします。    

【26638】Re:表の比較修正
回答  Jaka  - 05/7/12(火) 17:08 -

引用なし
パスワード
   こんにちは。

もしかして削除とかしないとダメだったんでしょうか?
そこまで頭が回りません出でした。

Sub dnnn()
Dim Cel As Range
With Sheets("Sheet2")
For Each Cel In .Range("A2", .Range("A65536").End(xlUp))
  Mct = Application.Match(Cel.Value, Sheets("Sheet1").Columns(1), 0)
  If IsError(Mct) Then
    Sheets("Sheet1").Range("A65536").End(xlUp).Offset(1).Resize(, 3).Value = _
    Cel.Resize(, 3).Value
  Else
    Sheets("Sheet1").Range("A" & Mct).Resize(, 3).Value = _
    Cel.Resize(, 3).Value
  End If
Next
End With
End Sub

【26647】Re:表の比較修正
お礼  こなつ  - 05/7/12(火) 18:51 -

引用なし
パスワード
   ▼Jaka さん:
>こんにちは。
>
>もしかして削除とかしないとダメだったんでしょうか?
>そこまで頭が回りません出でした。
>
>Sub dnnn()
>Dim Cel As Range
>With Sheets("Sheet2")
>For Each Cel In .Range("A2", .Range("A65536").End(xlUp))
>  Mct = Application.Match(Cel.Value, Sheets("Sheet1").Columns(1), 0)
>  If IsError(Mct) Then
>    Sheets("Sheet1").Range("A65536").End(xlUp).Offset(1).Resize(, 3).Value = _
>    Cel.Resize(, 3).Value
>  Else
>    Sheets("Sheet1").Range("A" & Mct).Resize(, 3).Value = _
>    Cel.Resize(, 3).Value
>  End If
>Next
>End With
>End Sub

早速の回答ありがとうございます。

 すいません。お願い追いでで申し訳ありませんが
 上のプログラム解説していただければ
 非常にありがたいのですが、何とかお願いいたします。

 あと、メインの表の方は削除(行ごと)がいります。
 重ね重ね宜しくお願いします。

【26660】Re:表の比較修正
回答  Jaka  - 05/7/13(水) 10:47 -

引用なし
パスワード
   こんにちは。
昨日は、削除の事は頭が回らなかったと書いたけど、正確には削除の条件を考えるのが面倒だったという事です。
なんか例題を見てみると、最終的にはSheet2(修正)にメインの使用個数が書き足してあるだけ見たいですが....。
この線で行くと、マクロなど必要ないように見えますが、
Sheet2(修正)のセルD2に下記関数を入れ必要な所までフィル。
=IF(ISNA(VLOOKUP(A2,Sheet1!$A$1:$D$7,4,0)),"",VLOOKUP(A2,Sheet1!$A$1:$D$7,4,0))

Sheet2(修正)のデータ部をコピーして、Sheet1(メイン)のデータ部に値だけ貼り付けでも出来ますけど。

>プログラム解説していただければ
うまく解説が出来ませんでした。
特別難しいことはしてないと思いますから、Match、 Offset、Resizeは、ヘルプを見てください。

>With Sheets("Sheet2")
Sheet2のA2からA列最終行までのセルを検索値としてループ
>For Each Cel In .Range("A2", .Range("A65536").End(xlUp))
   Sheet2セルの値と同じ物がSheet1.1列目の何番目にあるかチェック(エクセルのMatch関数を使用)
>  Mct = Application.Match(Cel.Value, Sheets("Sheet1").Columns(1), 0)

   変数MCTがエラーなら(同じ物が無ければ)
>  If IsError(Mct) Then
    Sheet1、A列最終行の次の行の1列から3列分にSheet2の検索値としたセルから3列分値を入れる。
>    Sheets("Sheet1").Range("A65536").End(xlUp).Offset(1).Resize(, 3).Value = _
>    Cel.Resize(, 3).Value
>  Else
    エラーでなければ何行目にあるかMctに行番号が入っているから、
    Sheet1のその行の1列から3列分にSheet2の検索値としたセルから3列分値を入れる。
>    Sheets("Sheet1").Range("A" & Mct).Resize(, 3).Value = _
>    Cel.Resize(, 3).Value
>  End If
>Next

【26671】Re:表の比較修正
お礼  こなつ  - 05/7/13(水) 18:29 -

引用なし
パスワード
   ▼Jaka さん:
>こんにちは。
>昨日は、削除の事は頭が回らなかったと書いたけど、正確には削除の条件を考えるのが面倒だったという事です。
>なんか例題を見てみると、最終的にはSheet2(修正)にメインの使用個数が書き足してあるだけ見たいですが....。
>この線で行くと、マクロなど必要ないように見えますが、
>Sheet2(修正)のセルD2に下記関数を入れ必要な所までフィル。
>=IF(ISNA(VLOOKUP(A2,Sheet1!$A$1:$D$7,4,0)),"",VLOOKUP(A2,Sheet1!$A$1:$D$7,4,0))
>
>Sheet2(修正)のデータ部をコピーして、Sheet1(メイン)のデータ部に値だけ貼り付けでも出来ますけど。
>
>>プログラム解説していただければ
> うまく解説が出来ませんでした。
> 特別難しいことはしてないと思いますから、Match、 Offset、Resizeは、ヘルプを見てください。
>
>>With Sheets("Sheet2")
>Sheet2のA2からA列最終行までのセルを検索値としてループ
>>For Each Cel In .Range("A2", .Range("A65536").End(xlUp))
>   Sheet2セルの値と同じ物がSheet1.1列目の何番目にあるかチェック(エクセルのMatch関数を使用)
>>  Mct = Application.Match(Cel.Value, Sheets("Sheet1").Columns(1), 0)
>
>   変数MCTがエラーなら(同じ物が無ければ)
>>  If IsError(Mct) Then
>    Sheet1、A列最終行の次の行の1列から3列分にSheet2の検索値としたセルから3列分値を入れる。
>>    Sheets("Sheet1").Range("A65536").End(xlUp).Offset(1).Resize(, 3).Value = _
>>    Cel.Resize(, 3).Value
>>  Else
>    エラーでなければ何行目にあるかMctに行番号が入っているから、
>    Sheet1のその行の1列から3列分にSheet2の検索値としたセルから3列分値を入れる。
>>    Sheets("Sheet1").Range("A" & Mct).Resize(, 3).Value = _
>>    Cel.Resize(, 3).Value
>>  End If
>>Next

ご丁寧な回答どうもありがとうございました。

 削除・増減については例題が悪くて申し訳ありませんでした
 実際は、修正用の表に対してマスター表は+20桁ぐらい
 追加していまして、修正用をそのままコピペすると
 追加分がずれてしまったりして収拾がつかなくなって
 しまうものですから(^^ゞなんとか 表の比較+行の削除
 と行の追加を自動化したかったんです。

 また、分からない時はいろいろとご教授お願いするかも
 しれませんが、宜しくお願いします。
 
 

9562 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free