Excel VBA質問箱 IV

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

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


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

【24060】ファイルをまたいでセルをコピーする。 sakura 05/4/11(月) 14:35 質問[未読]
【24064】Re:ファイルをまたいでセルをコピーする。 Kein 05/4/11(月) 15:19 回答[未読]
【24065】Re:ファイルをまたいでセルをコピーする。 Kein 05/4/11(月) 15:22 発言[未読]
【24092】Re:ファイルをまたいでセルをコピーする。 sakura 05/4/12(火) 11:53 質問[未読]
【24102】Re:ファイルをまたいでセルをコピーする。 Kein 05/4/12(火) 13:16 発言[未読]
【24104】Re:ファイルをまたいでセルをコピーする。 sakura 05/4/12(火) 13:41 質問[未読]
【24115】Re:ファイルをまたいでセルをコピーする。 Kein 05/4/12(火) 14:30 回答[未読]

【24060】ファイルをまたいでセルをコピーする。
質問  sakura  - 05/4/11(月) 14:35 -

引用なし
パスワード
   いつも大変貴重なアドバイスを頂きましてありがとうございます。

さて、今回質問させていただくのは列と列を比較して重複していない情報を
書き込みたいのですが・・・


読み込み元ファイル
テキスト名:テキスト.txt

書き込み先ファイル
book名:book.xls


Sub Sample()
Dim buf1 As String
Dim buf2 As String

  ChDir "C:\"
  buf1 = Application.GetOpenFilename("*.txt,*.txt")
  If buf1 = "False" Then Exit Sub
  Workbooks.OpenText Filename:=buf1, _
            Origin:=xlWindows, _
            StartRow:=1, _
            DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, _
            ConsecutiveDelimiter:=False, _
            Tab:=False, _
            Semicolon:=False, _
            Comma:=True, _
            Space:=False, _
            Other:=False, _
            FieldInfo:=Array(Array(1, 1), Array(2, 1), _
                    Array(3, 1), Array(4, 1), _
                    Array(5, 1), Array(6, 1), _
                    Array(7, 1), Array(8, 1))
'            TrailingMinusNumbers:=True


  Set ObjSht1 = ActiveWorkbook.ActiveSheet
 
  ChDir "C:\"
  buf2 = Application.GetOpenFilename("*.xls,*.xls")
  If buf2 = "False" Then Exit Sub
  Workbooks.Open buf2
 
  Set ObjBook1 = ActiveWorkbook

とこのような形でbuf1にテキスト.txtをbuf2にbook.xlsを読み込ませます。
このことで、テキスト.txtのA列の2〜65536とbook.xlsのA列の2〜65536
までを比較して、book.xlsにない項目をbook.xlsのA列の最終に追加した
いのです。

比較して最終行に書き込みマクロってどんな感じになるのかアドバイスを
いただけないでしょうか?

最終行は何行目になるかわからないので最終行のセル番地も取得するマクロ
であるととても助かります。

【24064】Re:ファイルをまたいでセルをコピーする。
回答  Kein  - 05/4/11(月) 15:19 -

引用なし
パスワード
   Dim Ad As String, C As Range '変数の宣言を追加

中略

Set ObjSht1 = ActiveWorkbook.ActiveSheet
ChDir "C:\"
buf2 = Application.GetOpenFilename("*.xls,*.xls")
If buf2 = "False" Then Exit Sub
WorkBooks.Open buf2
On Error GoTo ELine
With ActiveWorkbook.Worksheets("Sheet1")
  Ad = .Range("A2", .Range("A65536").End(xlUp)).Address
End With
With ObjSht1.Range("A2", ObjSht1.Range("A65536").End(xlUp)).Offset(, 1)
  .Formula = "=MATCH($A2,[" & Dir(buf2) & "]Sheet1!" & Ad & ",0)"
  For Each C In .SpecialCells(3, 16)
   ActiveWorkbook.Worksheets("Sheet1").Range("A65536") _
   .End(xlUp).Offset(1).Value = C.Offset(, -1).Value
  Next
  .ClearContents
End With
ActiveWorkbook.Close True
Workbooks(2).Close False

概ねこんな感じでよいかと思います。

【24065】Re:ファイルをまたいでセルをコピーする。
発言  Kein  - 05/4/11(月) 15:22 -

引用なし
パスワード
   >On Error GoTo ELine
と、エラートラップを入れたので、どこかに

ELine:

とラベルを入れて、SpecialCells(3, 16) のセルが無かったときのエラーで
制御を飛ばす先を指定してください。

【24092】Re:ファイルをまたいでセルをコピーする。
質問  sakura  - 05/4/12(火) 11:53 -

引用なし
パスワード
   Kein さんレスありがとうございます。

エラートラップはなしにして・・・

  buf2 = Application.GetOpenFilename("*.xls,*.xls")
  If buf2 = "False" Then Exit Sub
  Workbooks.Open buf2
 
  Set ObjBook1 = ActiveWorkbook
  
  With ActiveWorkbook.Worksheets("DS桑名")
   Ad = .Range("A2", .Range("A65536").End(xlUp)).Address
  End With

  With ObjSht1.Range("A2", ObjSht1.Range("A65536").End(xlUp)).Offset(, 1)
  .Formula = "=MATCH($A2,[" & Dir(buf2) & "]Sheet1!" & Ad & ",0)"
  For Each C In .SpecialCells(3, 16)
   ActiveWorkbook.Worksheets("Sheet1").Range("A65536") _
   .End(xlUp).Offset(1).Value = C.Offset(, -1).Value
  Next
  .ClearContents
  End With


  ObjBook1.Close True
  Set ObjBook1 = Nothing
  ObjSht1.Application.ActiveWorkbook.Close False
  Set ObjSht1 = Nothing


なぜか項目に同じ内容がかさなってでてきてしまうんですよね・・・・
なぜなんでしょう・・・

右側の空白をなくすVBAってありませんでしたでしょうか??
LなんとかとかRなんとかってのがあった気がするんですが・・・
それを利用すると明確になるんでしょうか??

【24102】Re:ファイルをまたいでセルをコピーする。
発言  Kein  - 05/4/12(火) 13:16 -

引用なし
パスワード
   >項目に同じ内容がかさなってでてきてしまう
意味が分かりかねますが・・。
>右側の空白をなくす
RTrim のことかな ? 前後のスペースを削除するなら Trim(文字列) です。
LTrim なら文字列の先頭のスペースを消します。

【24104】Re:ファイルをまたいでセルをコピーする。
質問  sakura  - 05/4/12(火) 13:41 -

引用なし
パスワード
   ▼Kein さん:
>>項目に同じ内容がかさなってでてきてしまう
>意味が分かりかねますが・・。

説明不足で大変申し訳ないです。
今回管理してるのは物品コードなのですが、比較した結果、book.xlsのA列にある物品コードまでbook.xlsのA列の最終に追加されているのです。


>RTrim のことかな ? 前後のスペースを削除するなら Trim(文字列) です。
>LTrim なら文字列の先頭のスペースを消します。
それのことです。説明不足にも関わらずさっしていただきありがとうございます。

【24115】Re:ファイルをまたいでセルをコピーする。
回答  Kein  - 05/4/12(火) 14:30 -

引用なし
パスワード
   >比較した結果、book.xlsのA列にある物品コードまでbook.xlsのA列の最終に追加
それはつまり、全データで一致するものが見当たらない、ということを示しています。
もし前後にスペースがあって、一致しないということが分かっているなら

With ActiveWorkbook.Worksheets("Sheet1")
  For Each C In .Range("A2", .Range("A65536").End(xlUp))
   C.Value = Trim(C.Value)
  Next
  Ad = .Range("A2", .Range("A65536").End(xlUp)).Address
End With
For Each C In ObjSht1.Range("A2", ObjSht1.Range("A65536").End(xlUp))
  C.Value = Trim(C.Value)
Next
With ObjSht1.Range("A2", ObjSht1.Range("A65536").End(xlUp)).Offset(, 1)
  .Formula = "=MATCH($A2,[" & Dir(buf2) & "]Sheet1!" & Ad & ",0)"
  For Each C In .SpecialCells(3, 16)
   ActiveWorkbook.Worksheets("Sheet1").Range("A65536") _
   .End(xlUp).Offset(1).Value = C.Offset(, -1).Value
  Next
  .ClearContents
End With

というようにスペースを削除します。どちらか一方でよければ、他方のループ処理
部分は不要になります。データの途中にスペースが含まれていないなら、Replaceで
取り除くこともできますね。

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