[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『条件分岐の方法』(BPA)
転記元のシート1のA列に氏名コートが6桁あり、
アタマ2桁が、75だったら、転記先のデータ2シートへ転記、
アタマ2桁が、72だったら、転記先のデータ3シートへ転記
それ以外は、データ1シートに転記を行うプログラムを考えています。
条件分岐の記載方法がわからず、困っています。
教えて頂けないでしょうか。
Sub 転記_Click()
Dim wb As Workbook Dim sh1,sh2 As Worksheet Dim Rout As Long
Dim FileName As String
FileName = Dir(ThisWorkbook.Path & "\*.xlsx") Rout = 7
Do While FileName <> "" If FileName <> ThisWorkbook.Name Then
Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & FileName, False, True)
Set sh1 = Workbooks.Worksheets("シート1") Set sh2 = Workbooks.Worksheets("シート2")
For Each sh1,sh2 In wb.Worksheets
If left(sh1.Range(Rout, "A"), 2)=75 Then
With ThisWorkbook.Worksheets("データ2")
.Cells(Rout+1, "B").Value = sh1.Range(Rout, "A").Value .Cells(Rout+1, "C").Value = sh1.Range(Rout, "F").Value .Cells(Rout+1, "D").Value = sh1.Range(Rout, "B").Value .Cells(Rout+1, "E").Value = sh1.Range(Rout, "G").Value .Cells(Rout+1, "F").Value = sh1.Range(Rout, "AA").Value .Cells(Rout+1, "G").Value = sh2.Range(Rout, "AA").Value
End With
Rout = Rout + 1
If left(sh1.Range(Rout, "A"), 2)=72 Then
With ThisWorkbook.Worksheets("データ3")
.Cells(Rout+1, "B").Value = sh1.Range(Rout, "A").Value .Cells(Rout+1, "C").Value = sh1.Range(Rout, "F").Value .Cells(Rout+1, "D").Value = sh1.Range(Rout, "B").Value .Cells(Rout+1, "E").Value = sh1.Range(Rout, "G").Value .Cells(Rout+1, "F").Value = sh1.Range(Rout, "AA").Value .Cells(Rout+1, "G").Value = sh2.Range(Rout, "AA").Value
Else
With ThisWorkbook.Worksheets("データ1")
.Cells(Rout+1, "B").Value = sh1.Range(Rout, "A").Value .Cells(Rout+1, "C").Value = sh1.Range(Rout, "F").Value .Cells(Rout+1, "D").Value = sh1.Range(Rout, "B").Value .Cells(Rout+1, "E").Value = sh1.Range(Rout, "G").Value .Cells(Rout+1, "F").Value = sh1.Range(Rout, "AA").Value .Cells(Rout+1, "G").Value = sh2.Range(Rout, "AA").Value
End If
wb.Close False
End If FileName = Dir
Loop
MsgBox "処理終了"
End Sub
< 使用 Excel:Excel2019、使用 OS:Windows8 >
おはよ〜ございます ^^ いろいろ、方法は有るかと思いますが一案で。^^; コード、よく見て無いので。。。その。なんですが Select Case 頭の二文字 Case "72" 72の時の処理 Case "75" 75の時の処理 Case Else それ以外の処理 End Select とかでも 同じような内容なら、サブルーチンで引数を渡し、72,75、他 の処理を分けるとかも、よいかもですね。 詳細は検索していただくと、懇切丁寧な説明サイトがたくさんありますよ。 (隠居Z) 2021/11/14(日) 10:00
あれ?。。。^^; [[20211114090213]]と同じ方でしたら どちらかで 纏めてご質問された方が、回答者の皆様も解りやすいかと。 (隠居Z) 2021/11/14(日) 11:22
■1
偶然なのかもしれませんが、↓の方と同じ失敗をしているところがありますので、まずはそこを修正されるとよいでしょう。
[[20211114090213]] 『フォルダ内のエクセルを選択し、選択したエクセルデータを転記するプログラム』(P)
For Each sh1,sh2 In wb.Worksheets
Set sh1 = Workbooks.Worksheets("シート1") Set sh2 = Workbooks.Worksheets("シート2")
■2
どうでもいい部分を除くと↓のようになってます。
Do While FileName <> "" If FileName <> ThisWorkbook.Name Then For Each sh In wb.Worksheets'■1を修正したとして If Left(sh1.Range(Rout, "A"), 2) = 75 Then With ThisWorkbook.Worksheets("データ2") End With
Rout = Rout + 1 If Left(sh1.Range(Rout, "A"), 2) = 72 Then With ThisWorkbook.Worksheets("データ3") Else With ThisWorkbook.Worksheets("データ1") End If
wb.Close False End If FileName = Dir Loop
これを↓のように修正すべきでしょう。
Rout = 7 Do While FileName <> "" If FileName <> ThisWorkbook.Name Then Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & FileName, False, True)
For Each sh In wb.Worksheets '■1を修正したとして If Left(sh1.Range(Rout, "A"), 2) = 75 Then With ThisWorkbook.Worksheets("データ2") End With
Rout = Rout + 1 If Left(sh1.Range(Rout, "A"), 2) = 72 Then With ThisWorkbook.Worksheets("データ3") End With '★追加 Else With ThisWorkbook.Worksheets("データ1") End With '★追加 End If End If '★「If Left(sh1.Range(Rout, "A"), 2) = 75」に対するEnd If を追加 Next sh '★「For Each sh In wb.Worksheets」に対するNextを追加
wb.Close False End If
FileName = Dir Loop
■3
「■2」のように修正したとして、すべて↓の条件ありきになっているわけです。
If Left(sh1.Range(Rout, "A"), 2) = 75
やりたいことはそうではないですよね?
したがって↓のような形にすべきでしょう。
If Left(sh1.Range(Rout, "A"), 2) = 75 Then 'データ2へ転記
ElseIf Left(sh1.Range(Rout, "A"), 2) = 72 Then 'データ3へ転記
Else 'データ1へ転記 End If
または Select Case Left(sh1.Range(Rout, "A").Value, 2) Case "75" 'データ2へ転記
Case "72" 'データ3へ転記
Case Else 'データ1へ転記 End Select
■4
さらに↓もおかしいですよ。
Rout = Rout + 1
これだと、書き込む行も読み込む行もどんどんずれていくので、データもとのブックに1行しかないのであっても、読み込む行の開始位置がおかしなことになりますよ。
さらに、書き込む行もシートが振り分けられるのですから、1行書き込んだら1行ずらせば済む問題ではありません。
■5
以上を踏まえると
(1) 自ブック側に作業用シートを用意する
(2) データもとのブックを開く
(3) フィルタオプションで(2)の対象シートから750000〜759999のデータを【抽出】する (4) (3)を対象シートの最終行+1のところに貼付する
(5) フィルタオプションで(2)の対象シートから720000〜729999のデータを【抽出】する (6) (5)を対象シートの最終行+1のところに貼付する
(7) フィルタオプションで(2)の対象シートから、750000〜759999、720000〜729999以外のデータを【抽出】する (8) (7)を対象シートの最終行+1のところに貼付する
(9) データもとのブックを保存せずに閉じる
(2)〜(9)をブックの数だけ繰り返す
というアプローチでも対応可能かとおもいますので、研究されてみてはいかがでしょうか。
(もこな2) 2021/11/14(日) 11:24
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.