Excel VBA質問箱 IV

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

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


8643 / 13646 ツリー ←次へ | 前へ→

【32030】2つのシートの一方から必要情報を抽出するには にしもり 05/12/4(日) 23:32 質問[未読]
【32037】Re:2つのシートの一方から必要情報を抽出... やっちん 05/12/5(月) 8:16 発言[未読]
【32072】Re:2つのシートの一方から必要情報を抽出... やっちん 05/12/5(月) 18:50 発言[未読]
【32079】Re:2つのシートの一方から必要情報を抽出... にしもり 05/12/5(月) 22:56 質問[未読]
【32080】Re:2つのシートの一方から必要情報を抽出... ponpon 05/12/5(月) 23:21 発言[未読]
【32081】Re:2つのシートの一方から必要情報を抽出... やっちん 05/12/5(月) 23:40 発言[未読]
【32087】Re:2つのシートの一方から必要情報を抽出... にしもり 05/12/6(火) 9:11 質問[未読]
【32088】Re:2つのシートの一方から必要情報を抽出... にしもり 05/12/6(火) 9:17 お礼[未読]
【32092】Re:2つのシートの一方から必要情報を抽出... やっちん 05/12/6(火) 12:59 発言[未読]
【32123】Re:2つのシートの一方から必要情報を抽出... にしもり 05/12/6(火) 18:15 お礼[未読]
【32125】Re:2つのシートの一方から必要情報を抽... やっちん 05/12/6(火) 19:04 発言[未読]

【32030】2つのシートの一方から必要情報を抽出す...
質問  にしもり  - 05/12/4(日) 23:32 -

引用なし
パスワード
   こんにちは。
EXCELが2つあります。
一方は現場の作成する当月の勤務情報表です。(例:12月)
B列に社員コード、AL列に31日の勤務情報が、「休暇」「産休」「出向」などと文字列で入っています。(30日の場合はAK列に勤務情報が入っています。)
データは5列目から入っています。理論上はexcelの最下端まで入れられます。

他方は本部が作成する翌月の勤務情報表です。(例:1月)
A列に社員コード、E列に1日の勤務情報が、「休暇」「産休」「出向」など文字列で入っています。データは5列目から入っています。理論上はexcelの最下端まで入れられます。

いま現場の作成する当月の勤務情報表の末日に「休暇」もしくは「産休」とある人のみを、本部が作成する翌月の勤務情報表から抽出したいのですが、VLOOKUPで手でやると、油断すると間違えてしまうのです。そこでVBAでやりたいのですがどのようにしていいか正直絵が描けない状況です。おそらく両ブックの両シートをアクティヴにして、社員コード同士を当てるのでしょうが、それからどうすればいいかわかりません。どのように記述するのが効率的でしょうか?

いつまでたっても進歩しないわたしですが、どうかアドバイスよろしくお願いします。なお、現場と本部の様式はどちらかに統一できない状況なので、仕方なくそのようなことをしております。

【32037】Re:2つのシートの一方から必要情報を抽...
発言  やっちん  - 05/12/5(月) 8:16 -

引用なし
パスワード
   ▼にしもり さん:
こんにちは。
一番簡単なのは
両ブックを開いて社員コードの突合せ処理を行うことでしょう。
昇順か降順に並んでいることが前提になりますが。

処理速度を考えると次のようなやり方になると思われます。
1.現場の勤務情報表の末日の列を求める。
2.5行目から社員コードが入っている行まで以下の処理を繰り返す。
 (1).末日の列に「休暇」「産休」が入っている場合
     社員コードをキーにして翌月の勤務情報表のA列をFINDで検索しその行を取得する。
 (2).必要な範囲をコピーして別のシートへペースト。

【32072】Re:2つのシートの一方から必要情報を抽...
発言  やっちん  - 05/12/5(月) 18:50 -

引用なし
パスワード
   ▼やっちん さん:
こんにちは。
条件が2つなので先にフィルターをかけてもいいですね。

【32079】Re:2つのシートの一方から必要情報を抽...
質問  にしもり  - 05/12/5(月) 22:56 -

引用なし
パスワード
   ▼やっちん さん:

アドバイスのとおりFINDを使うにはソートしなくてはいけないとのことで、
ちょっとむずかしいので下記のようなロジックを書いてみました。
現場勤務表.xlsの45列目に、文字列の中身を判断することなしに転記してるつもりです。
ですが、Nextに対するforがありませんと出ます。
どこが悪いか教えてください。

Sub Getumatsu()

Dim SH1 As Worksheet
Dim SH2 As Worksheet
Dim MyRow1 As Long
Dim MyRow2 As Long
Dim MyVal1 As String
Dim MyVal2 As String

Workbooks("現場勤務表.xls").Activate
Workbooks("本部勤務表.xls").Activate
Set SH1 = Workbooks("現場勤務表.xls").Worksheets("200511")
Set SH2 = Workbooks("本部勤務表.xls").Worksheets("Sheet1")

MyRow1 = SH1.Range("A65536").End(xlUp).Row
MyRow2 = SH1.Range("A65536").End(xlUp).Row

For i = 5 To MyRow1
  MyVal1 = SH1.Cells(i, 1)
  For j = 5 To MyRow1
    MyVal2 = SH2.Cells(j, 1)
    If MyVal1 = MyVal2 Then
    SH1.Cells(i, 45) = SH2.Cells(j, 5)
    If IsEmpty(MyVal1) Then Exit Sub
  Next j
Next i

End Sub

【32080】Re:2つのシートの一方から必要情報を抽...
発言  ponpon  - 05/12/5(月) 23:21 -

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

コードはよく見ていませんが、

>If MyVal1 = MyVal2 Then
> SH1.Cells(i, 45) = SH2.Cells(j, 5)
End If '←これがない 
> If IsEmpty(MyVal1) Then Exit Sub
>Next j

【32081】Re:2つのシートの一方から必要情報を抽...
発言  やっちん  - 05/12/5(月) 23:40 -

引用なし
パスワード
   ▼にしもり さん:
こんばんは。
FINDではソートの必要はありませんよ。
ソートが必要なのは、お互いのシートの社員コードを上から順に比較していく
やり方の場合です。

【32087】Re:2つのシートの一方から必要情報を抽...
質問  にしもり  - 05/12/6(火) 9:11 -

引用なし
パスワード
   ▼やっちん さん:
やっちんさん、ponponさん、ありがとうございます。
END IFを入れたら実行だけはできました。
が、私の意図どうりになりません。
10分くらいかかって終わりました。
しかも現場勤務表.xlsの45列目に本部勤務表から文字転記されていません。
しかも処理のおわったEXCELのセルをクリックするとそこが反転し、つかんだまま離さない状態になってしまいます。
なにが悪いのですか?

【32088】Re:2つのシートの一方から必要情報を抽...
お礼  にしもり  - 05/12/6(火) 9:17 -

引用なし
パスワード
   ▼やっちんさん、ponponさん:
自己レスです。
実際にデータのはいっている2000行にとどめたら、なんとかできたようです。
どうもありがとうございました。
MyRow1 = SH1.Range("A2000").End(xlUp).Row
MyRow2 = SH1.Range("A2000").End(xlUp).Row

【32092】Re:2つのシートの一方から必要情報を抽...
発言  やっちん  - 05/12/6(火) 12:59 -

引用なし
パスワード
   ▼にしもり さん:
こんにちは。
まだ見ていらっしゃるかわかりませんが
セル一つの転記であれば
VLOOKUPを使用することをお勧めします。


今のコードを見ましたが、他にも修正が必要では?
   
>MyRow2 = SH1.Range("A65536").End(xlUp).Row
MyRow2 = SH2.Range("A65536").End(xlUp).Row

>  For j = 5 To MyRow1
  For j = 5 To MyRow2

【32123】Re:2つのシートの一方から必要情報を抽...
お礼  にしもり  - 05/12/6(火) 18:15 -

引用なし
パスワード
   ▼やっちん さん:
>
>今のコードを見ましたが、他にも修正が必要では?
>   
>>MyRow2 = SH1.Range("A65536").End(xlUp).Row
>MyRow2 = SH2.Range("A65536").End(xlUp).Row
>
>>  For j = 5 To MyRow1
>  For j = 5 To MyRow2

おっしゃるとおりです。
失礼しました。

関数を使いこなせるようになりたいです。

【32125】Re:2つのシートの一方から必要情報を抽...
発言  やっちん  - 05/12/6(火) 19:04 -

引用なし
パスワード
   ▼にしもり さん:
こんにちは。
VBAで使用するVLOOKUPはシート関数なので
シートでの使い方がわかっていれば
簡単に使えると思いますよ。

過去ログ
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=28936;id=excel

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