電子書籍の厳選無料作品が豊富!

シート1のA列に 1A 1B 2A 2B 3A 3Bという数値が不規則に入力されている
シート1のB列に 斉藤 佐藤 鈴木 等の名前
シート1のC列に 時間
シート1のD列に 休
A列を検索して1A表示ありD列で”休”以外のB列の名前とC列の時間をシート2の1A行のB・C・D・・セルに時間基準で連続してコピーする
シート1のデータは300行くらいです

シート1
A   B     C    D
1a  斉藤  8:20   休
1b  佐藤  9:00
2a  鈴木  9:10
1b  大田  9:20
1a  加藤  8:40
2a  青木  8:30
1a  青山  8:40
3a  中山  8:30   休
3b  高橋  9:20


         
シート2
A     B      C      D     E
1a    加藤     青山
時間   8:40  8;40
1b    佐藤     大田
時間   9:00  9:20
2a    青木     鈴木
時間   8:30  9:10
2b
時間
3a
時間
3b    高橋
時間   9:20


という表を手作業で100件ほど毎日やっていますが効率と正確性のためマクロを試していますがうまく出来ません。If Then Do Loop など見よう見まねですがうまく行きません。どなたか助けてください。よろしくお願いいたします。

A 回答 (3件)

No.1です。



>シート2の最上行にA列空白のB列名前が連続でコピーされてしまいます

前回のコードは消去し、↓のコードに変更してみてください。
(エラー処理を少し加えています)

Sub Sample2()
Dim i As Long, lastRow As Long, lastCol As Long
Dim c As Range, wS As Worksheet

Set wS = Worksheets("Sheet2")
lastRow = wS.Cells(Rows.Count, "A").End(xlUp).Row
lastCol = wS.UsedRange.Columns.Count
Application.ScreenUpdating = False
If lastCol > 1 Then '//←念のため//
Range(wS.Cells(1, "B"), wS.Cells(lastRow, lastCol)).ClearContents
End If
With Worksheets("Sheet1")
For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
If .Cells(i, "A") <> "" Then '//←追加★//
If .Cells(i, "D") <> "休" Then
Set c = wS.Range("A:A").Find(what:=.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole)
lastCol = wS.Cells(c.Row, Columns.Count).End(xlToLeft).Column + 1
.Cells(i, "B").Copy wS.Cells(c.Row, lastCol)
.Cells(i, "C").Copy wS.Cells(c.Row + 1, lastCol)
End If
End If '//←追加★//
Next i
End With
wS.Activate
Application.ScreenUpdating = True
MsgBox "完了"
End Sub

今度はどうでしょうか?

※ 未検証なので、お望み通りにならなかったらごめんなさい。m(_ _)m
    • good
    • 0
この回答へのお礼

本当に有難うございました。見事に出来ました。有難うございました。
各コードの意味は勉強します。これで処理が大幅に楽になり正確になりました。感謝です。

お礼日時:2017/10/16 20:21

Sheet1 において、


1.列Fを作業列として、次式を入力したセル F1 を下方にズズーッとオートフィル
 ̄ ̄ =HOUR(C1)*100+MINUTE(C1)+ROW()/1000
Sheet2 において、
2.下記の左端に示す各セルにそれぞれの右側の式を入力して、範囲B1:B2 を右隣にオートフィル
 ̄ ̄B1: =IFERROR(INDEX(Sheet1!$B$1:$B$350,MATCH(SMALL(IF((Sheet1!$A$1:$A$350=$A1)*(Sheet1!$D$1:$D$350<>"休"),Sheet1!$F$1:$F$350,""),COLUMN(A1)),Sheet1!$F$1:$F$350,0)),"")
 ̄ ̄B2: =IFERROR(INDEX(Sheet1!$C$1:$C$350,MATCH(SMALL(IF((Sheet1!$A$1:$A$350=$A1)*(Sheet1!$D$1:$D$350<>"休"),Sheet1!$F$1:$F$350,""),COLUMN(A1)),Sheet1!$F$1:$F$350,0)),"")
 ̄ ̄【お断り】上式は必ず配列数式として入力のこと
3.範囲 B1:C2 を下方にズズーッとオートフィル
「シート1の情報を複数条件で検索し該当情報」の回答画像2
    • good
    • 0
この回答へのお礼

有難うございました。配列数式を勉強します。

お礼日時:2017/10/16 22:24

こんばんは!



↓の画像のような配置になっているとします。(Sheet1の1行目は項目行)
尚、Sheet2のA列は入力済みだという前提です。
標準モジュールにしてください。

Sub Sample1()
Dim i As Long, lastRow As Long, lastCol As Long
Dim c As Range, wS As Worksheet

Set wS = Worksheets("Sheet2")
lastRow = wS.Cells(Rows.Count, "A").End(xlUp).Row
lastCol = wS.UsedRange.Columns.Count
Application.ScreenUpdating = False
Range(wS.Cells(1, "B"), wS.Cells(lastRow, lastCol)).ClearContents
With Worksheets("Sheet1")
For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
If .Cells(i, "D") <> "休" Then
Set c = wS.Range("A:A").Find(what:=.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole)
lastCol = wS.Cells(c.Row, Columns.Count).End(xlToLeft).Column + 1
.Cells(i, "B").Copy wS.Cells(c.Row, lastCol)
.Cells(i, "C").Copy wS.Cells(c.Row + 1, lastCol)
End If
Next i
End With
wS.Activate
Application.ScreenUpdating = True
MsgBox "完了"
End Sub

こんな感じではどうでしょうか?m(_ _)m
「シート1の情報を複数条件で検索し該当情報」の回答画像1
    • good
    • 0
この回答へのお礼

早速に有難うございました
出来ました! 感激です 有難うございました
シート1A列に空白のセルが存在していて、シート2の最上行にA列空白のB列名前が連続でコピーされてしまいます
ずうずうしいですがこの解決法も教えていただけると幸いです。

お礼日時:2017/10/15 23:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!