Excel VBA質問箱 IV

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

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


133 / 13645 ツリー ←次へ | 前へ→

【81841】次の列に続けて同じ処理を繰り返す方法 VBA初心者コウ 21/6/22(火) 19:19 質問[未読]
【81842】Re:次の列に続けて同じ処理を繰り返す方法 山内 21/6/23(水) 13:28 回答[未読]
【81848】Re:次の列に続けて同じ処理を繰り返す方法 VBA初心者コウ 21/6/27(日) 21:09 質問[未読]
【81850】Re:次の列に続けて同じ処理を繰り返す方法 山内 21/6/28(月) 17:30 回答[未読]
【81851】Re:次の列に続けて同じ処理を繰り返す方法 山内 21/6/28(月) 17:31 発言[未読]
【81853】Re:次の列に続けて同じ処理を繰り返す方法 VBA初心者コウ 21/6/30(水) 11:43 質問[未読]
【81854】Re:次の列に続けて同じ処理を繰り返す方法 山内 21/6/30(水) 17:22 回答[未読]
【81855】Re:次の列に続けて同じ処理を繰り返す方法 VBA超初心者コウ 21/7/2(金) 15:39 質問[未読]
【81856】Re:次の列に続けて同じ処理を繰り返す方法 山内 21/7/2(金) 17:18 回答[未読]
【81858】Re:次の列に続けて同じ処理を繰り返す方法 VBA超初心者コウ 21/7/3(土) 19:00 質問[未読]
【81860】Re:次の列に続けて同じ処理を繰り返す方法 山内 21/7/5(月) 14:35 回答[未読]

【81841】次の列に続けて同じ処理を繰り返す方法
質問  VBA初心者コウ  - 21/6/22(火) 19:19 -

引用なし
パスワード
   こんにちは。VBA超初心者です。

仕事でお客様の予約表を作成したいと思っています。
印刷の都合上、同じ時間枠を2列(5行×2列)で表を作成しています。
この場合、シート@に10行で書かれているお名前を、シートAの5行×2列の表のセルにどのようにして当て込めば良いかをご教示いただきたいです。
例えば8名が12時に10名が13時に予約していたり、日により予約の人の数は変動します。
そのため、12時の5行×2列に8名、13時の5行2列に10名と変動に対応して当て込めたいと考えています。
シート@の数の変動に対応しつつ、シートAの表に列に処理を繰り返すためにはどの様にしたらよろしいのでしょうか。

例えばシート@に
A列に予約時間(12時、13時など)
B列にお名前(Zさん、Yさん、Xさん、…など)
が入力されているとして、
シートAの
A1に12時(B1とセル結合)
C1に13時(D1とセル結合)
と記載された表の
A2:B6までに12時予約の人の名前
C2:D6までに13時予約の人の名前
を入れる方法を教えていただけますと大変助かります。

分かりにくくて申し訳ございませんがどなたかよろしくお願いします。

【81842】Re:次の列に続けて同じ処理を繰り返す方法
回答  山内  - 21/6/23(水) 13:28 -

引用なし
パスワード
   やり方は色々あると思いますけど
シート1.のB列の最初の行から最終行までの値をIfやSelect caseで判別して
シート1.のA列とB列をシート2.にコピーしていけばいいのではないでしょうか

for next
if(もしくはselect caseなど)
あとは最終行の取得方法とかを調べるとできると思います。

【81848】Re:次の列に続けて同じ処理を繰り返す方法
質問  VBA初心者コウ  - 21/6/27(日) 21:09 -

引用なし
パスワード
   ご丁寧に教えていただきありがとうございます。
教えていただいたものを調べまして、
IFを使用して判別をしました。
しかし、判別で漏れるはずの時間帯の人が2列目に出てくるなど、
色々試してみましたが、隣の列に続けるところで処理がうまくいきません。
隣の列に続ける場合はどのように入力したらよろしいのでしょうか。
また。12時の最終行を取得という場合にはどのようにしたら良いのでしょうか。
私の説明が乏しいのですが、知識がないもので上手く説明できず…。
お手間をお取りして申し訳ございません。
よろしければご教授くださいませ。

【81850】Re:次の列に続けて同じ処理を繰り返す方法
回答  山内  - 21/6/28(月) 17:30 -

引用なし
パスワード
   ▼VBA初心者コウ さん:
>ご丁寧に教えていただきありがとうございます。
>教えていただいたものを調べまして、
>IFを使用して判別をしました。
>しかし、判別で漏れるはずの時間帯の人が2列目に出てくるなど、
>色々試してみましたが、隣の列に続けるところで処理がうまくいきません。
>隣の列に続ける場合はどのように入力したらよろしいのでしょうか。
>また。12時の最終行を取得という場合にはどのようにしたら良いのでしょうか。
>私の説明が乏しいのですが、知識がないもので上手く説明できず…。
>お手間をお取りして申し訳ございません。
>よろしければご教授くださいませ。

条件に当てはまらない人が出てくるのはどこかで条件が間違っているか
もしくは列の指定が間違っているかだと思います。
コードをコピペしてくれたら原因を指摘できるかもしれません。
12時の範囲がA2:B6で決まっているのだったらFor Eachでセルの値が空白ならその場所に書き込むとかでもいいかもしれません

Sub sample
  Dim rng12 As Range: Set rng12 = Worksheets("シート2.").Range("A2:B6")
  Dim rng As Range
  For Each rng In rng12 'rng12内でループ
    If rng.Value = "" Then
      rng.Value = "空白発見"
      Exit For
    End If
  Next
End Sub

【81851】Re:次の列に続けて同じ処理を繰り返す方法
発言  山内  - 21/6/28(月) 17:31 -

引用なし
パスワード
   >条件に当てはまらない人が出てくるのはどこかで条件が間違っているか
>もしくは列の指定が間違っているかだと思います。
>コードをコピペしてくれたら原因を指摘できるかもしれません。
>12時の範囲がA2:B6で決まっているのだったらFor Eachでセルの値が空白ならその場所に書き込むとかでもいいかもしれません
>
>Sub sample
>  Dim rng12 As Range: Set rng12 = Worksheets("シート2.").Range("A2:B6")
>  Dim rng As Range
>  For Each rng In rng12 'rng12内でループ
>    If rng.Value = "" Then
>      rng.Value = "空白発見"
>      Exit For
>    End If
>  Next
>End Sub
丸2が文字化けして2.に置き換わってます注意

【81853】Re:次の列に続けて同じ処理を繰り返す方法
質問  VBA初心者コウ  - 21/6/30(水) 11:43 -

引用なし
パスワード
   山内 様

丁寧なご回答をいただきまして誠にありがとうございます。
前任が作ったVBAを引き継いだため、どの辺りがうまく機能していないのかが
分からず…。一つ一つお答えをいただきまして大変助かります。

コードを以下に書き込み致しますので、
よろしければ見ていただけますと幸いです。
(初めから書き込めばよかったですね…。すみません。)
お付き合いいただきありがとうございます。
よろしくお願い申し上げます。

Sub 時間割作成成分()
  ScreenUpdating = False
    Range("A5:BD34").Select
    Selection.ClearContents
  Dim ws1 As Worksheet
  Set ws1 = Worksheets("CSVデータ取得")
  Dim ws2 As Worksheet
  Set ws2 = Worksheets("表")
  ws2.Cells(1, 1) = ws1.Cells(2, 11)
  
  Dim a As Integer
  
  Dim k As Integer
  k = 5
  
    For a = 2 To 80 Step 1
    If ws1.Cells(a, 4) = "カット" And ws1.Cells(a, 12) = "1200" And ws1.Cells(a, 14) = "予約可" Then
    ws2.Cells(k, 1) = ws1.Cells(a, 6)
    ws2.Cells(k + 2, 4) = ws1.Cells(a, 4)
    k = k + 6
    ElseIf ws1.Cells(a, 4) = "カラー" And ws1.Cells(a, 12) = "1200" And ws1.Cells(a, 14) = "予約可" Then
    ws2.Cells(k, 1) = ws1.Cells(a, 6)
    ws2.Cells(k + 2, 4) = ws1.Cells(a, 4)
    k = k + 6
    ElseIf ws2.Cells(29, 1) <> "" Then
    ws2.Cells(35, 1) = ""
    ws2.Cells(37, 1) = ""
    End If
    Next a
   
   
    For a = 2 To 80 Step 1
    If ws1.Cells(a, 4) = "カット" And ws1.Cells(a, 12) = "1200" And ws1.Cells(a, 14) = "要確認" Then
    ws2.Cells(k, 1) = ws1.Cells(a, 6)
    ws2.Cells(k + 2, 4) = ws1.Cells(a, 4)
    k = k + 6
    ElseIf ws1.Cells(a, 4) = "カラー" And ws1.Cells(a, 12) = "1200" And ws1.Cells(a, 14) = "要確認" Then
    ws2.Cells(k, 1) = ws1.Cells(a, 6)
    ws2.Cells(k + 2, 4) = ws1.Cells(a, 4)
    k = k + 6
    ElseIf ws2.Cells(29, 1) <> "" Then
    ws2.Cells(35, 1) = ""
    ws2.Cells(37, 1) = ""
    End If
    Next a
   
  '12:00-2
  
  Dim h As Integer
  h = 5
  
    For a = 2 To 80 Step 1
    If ws1.Cells(a, 4) = "カット" And ws1.Cells(a, 12) = "1200" And ws1.Cells(a, 14) = "予約可" Then
    ws2.Cells(h, 5) = ws1.Cells(a + 5, 6)
    
    ws2.Cells(h + 2, 8) = ws1.Cells(a + 5, 4)
    h = h + 6
    ElseIf ws1.Cells(a, 4) = "カラー" And ws1.Cells(a, 12) = "1200" And ws1.Cells(a, 14) = "予約可" Then
    ws2.Cells(h, 5) = ws1.Cells(a + 5, 6)
    ws2.Cells(h + 2, 8) = ws1.Cells(a + 5, 4)
    h = h + 6
    ElseIf ws2.Cells(23, 5) <> "" Then
    Range("E29", "H34") = ""
    End If
    Next
  
    For a = 2 To 80 Step 1
    If ws1.Cells(a, 4) = "カット" And ws1.Cells(a, 12) = "1200" And ws1.Cells(a, 14) = "要確認" Then
    ws2.Cells(h, 5) = ws1.Cells(a + 5, 6)
    ws2.Cells(h + 2, 8) = ws1.Cells(a + 5, 4)
    h = h + 6
    ElseIf ws1.Cells(a, 4) = "カラー" And ws1.Cells(a, 12) = "1200" And ws1.Cells(a, 14) = "要確認" Then
    ws2.Cells(h, 5) = ws1.Cells(a + 5, 6)
    ws2.Cells(h + 2, 8) = ws1.Cells(a + 5, 4)
    h = h + 6
    ElseIf ws2.Cells(23, 5) <> "" Then
    Range("E29", "H34") = ""
    End If
    Next
  
  
    For a = 2 To 80 Step 1
    If ws2.Cells(5, 1) = "" Or ws2.Cells(11, 1) = "" Or ws2.Cells(17, 1) = "" Or ws2.Cells(23, 1) = "" _
    Or ws2.Cells(29, 1) = "" Then
    Range("E5", "H34") = ""
    ElseIf ws1.Cells(a, 12) <> "1200" And ws1.Cells(a + 5, 4) = "カラー" Then
    ws2.Cells(h + 2, 5) = ""
    ws2.Cells(h, 8) = ""
    h = h + 6
    ElseIf ws1.Cells(a, 12) <> "1200" And ws1.Cells(a + 5, 4) = "トリートメント" Then
    ws2.Cells(h + 2, 5) = ""
    ws2.Cells(h, 8) = ""
    h = h + 6
   
    End If
    Next
    

・・・という風になっております。
12:00・13:30・15:00と続くため、コードはコピー&ペーストで時間のみを入れ替えています。
ws1.Cells(a, 6)にお名前
ws1.Cells(a, 4)にカット・カラー・トリートメントのどの予約なのかが入ります。

大変申し訳ございませんが、おかしな箇所がありましたらご指摘下さいますと幸いです。よろしくお願い申し上げます。

【81854】Re:次の列に続けて同じ処理を繰り返す方法
回答  山内  - 21/6/30(水) 17:22 -

引用なし
パスワード
   最初にA:Bに12時、C:Dに13時とおっしゃっていましたが
コードを見る限りA:Dが12時前半、E:Hが12時後半といった感じなのでしょうか?

ws1.Cells(a, 12) = "1200"の"1200"というのは12:00ということでしょうか?

a = 2 to 80で最高79個予約が入っている状態だと推測できるんですが
ElseIf ws2.Cells(29, 1) <> "" Then
 ws2.Cells(35, 1) = ""
 ws2.Cells(37, 1) = ""
End If
=""で空白にしてる部分全般に言えることなのですがなぜ空白にするのでしょうか
予約の上限なのでしょうか?
上限になったらExit Forなどでループから抜けるべきではないでしょうか

E:H列に書き込んでいく条件が
If ws1.Cells(a, 4) = "カット" And ws1.Cells(a, 12) = "1200" And ws1.Cells(a, 14) = "予約可" Then
とA:D列に書き込んでいく条件と全く同じなので二重予約になると思います。
正しい動作になのでしょうか?
間違った動作ならExit Forで抜けたところから再開するよう
For b = a to 80
など工夫が必要かもしれません。

Range("E29", "H34") = ""
などワークシートの指定がない箇所が複数あります。
こちらからはどのシートなのかわからないので指摘のしようがありません。

完成図が想像でしかわからないのでレイアウトを示してくれるともう少しはっきりとした回答ができるかもしれません。

【81855】Re:次の列に続けて同じ処理を繰り返す方法
質問  VBA超初心者コウ E-MAIL  - 21/7/2(金) 15:39 -

引用なし
パスワード
   山内様

ご丁寧にお答えをいただきましてありがとうございます。
予約表のシートがかなり複雑に感じまして簡略化してお伝えしておりました。
ご不便をおかけいたしまして申し訳ございません。

一人に対しての予約枠は6行×4列です。(A5:D10)
予約表(ws2)は以下A1に日付が入ります。
3行目カットとカラーの予約用の時間枠を入力しております。
A3:H4(セル結合)9:15 (A5:D10/E5:H10で2列が9:15の予約です。)
I3:P4      10:00
Q3:X4      12:00
AF3:AM4      13:00
AN3:AU4     15:00
AV3:BC4     16:00

2行ごとにセル結合を行っています。(実質3行)
予約者の名前は5行目に入ります。
A5:C6(セル結合)に予約者名
以下6行ごとにお名前が入ります。
(A11・A17・A23・A29)

予約の種類(カットかカラーか)D7:D8(セル結合)に入れます。
以下6行ごとに予約種類が入ります。
(D7・D13・D17・D23・D29)

書き込みができるように空白が多いようにしています。

この予約表がA5:BC34までで60枠できます。

ご面倒をおかけしておりました↓↓↓

a = 2 to 80で最高79個予約が入っている状態だと推測できるんですが

ElseIf ws2.Cells(29, 1) <> "" Then
 ws2.Cells(35, 1) = ""
 ws2.Cells(37, 1) = ""
End If
=""で空白にしてる部分全般に言えることなのですがなぜ空白にするのでしょうか
予約の上限なのでしょうか?
上限になったらExit Forなどでループから抜けるべきではないでしょうか

こちらは、35行目より下にもお名前が入っていたため、
それを表示しないように入力を入れておりました。

最高で79個予約が入るというご解釈で間違いございません。
”1200”は12:00の枠という事になります。
次の列に処理を続けたかったのですが
処理が下にしか続けることが出来なかったため、
9:15の処理を列ごとに分けて
2列目は毎回、変数aの隣の5名を除いた数という意味で a+5という形で入力していました。


exit for を使用してもうまく機能せず、loopもうまく隣に続きませんでした。

もしこれらを使用してもっと簡単になるのでありましたら
ぜひお教えいただけますと幸いです。
ご面倒をおかけいたしますがよろしくお願い申し上げます。
ありがとうございます。

【81856】Re:次の列に続けて同じ処理を繰り返す方法
回答  山内  - 21/7/2(金) 17:18 -

引用なし
パスワード
   とりあえず作ってみましたがカットやカラー、トリートメント
または予約可、要確認はどういう法則で並べていくのかよくわからないです。
A1セルが多分担当者の名前とかなんだろうと思いますが担当者によって条件が違うんでしょうか。


Sub 時間割作成成分()
  Application.ScreenUpdating = False
  
  Dim ws1 As Worksheet
  Set ws1 = Worksheets("CSVデータ取得")
  Dim ws2 As Worksheet
  Set ws2 = Worksheets("表")

  Dim a As Long
  Dim i As Long 'for行
  Dim j As Long 'for列
  Dim iLast As Long: iLast = 5  '1以上
  Dim jLast As Long
  Dim rng As Range
  Dim clmnplus As Long
  
  ws2.Range("A5:BD" & iLast * 6 + 4).ClearContents
  ws2.Cells(1, 1) = ws1.Cells(2, 11)
  
  For a = 2 To 80
    Select Case ws1.Cells(a, 12).Value
    Case "0915" '"915"かも?
      clmnplus = 0
    Case "1000"
      clmnplus = 8
    Case "1200"
      clmnplus = 16
    Case "1300"
      clmnplus = 31
    Case "1500"
      clmnplus = 39
    Case "1600"
      clmnplus = 47
    Case Else
      GoTo 脱出
    End Select
    'If (ws1.Cells(a, 4).Value = "カット" Or ws1.Cells(a, 4).Value = "カラー") _
    And ws1.Cells(a, 14).Value = "予約可" Then
    'よくわからないのでとりあえずコメントアウト
      For j = 1 To 2
        For i = 1 To iLast
          Set rng = ws2.Cells(i * 6 - 1, j * 4 - 3 + clmnplus)
          If rng.Value = "" Then
            rng.Value = ws1.Cells(a, 6).Value
            ws2.Cells(rng.Row + 2, rng.Column + 3).Value = ws1.Cells(a, 4).Value
            GoTo 脱出
          End If
        Next
      Next
    'End If
脱出:
  Next
  
  Application.ScreenUpdating = True
  
End Sub

【81858】Re:次の列に続けて同じ処理を繰り返す方法
質問  VBA超初心者コウ E-MAIL  - 21/7/3(土) 19:00 -

引用なし
パスワード
   山内 様

お世話になっております。
拙い説明の中でとても丁寧にご指導くださいましてありがとうございます。
初心者にも大変わかりやすい内容で助かります。
ご察しの通りws1.Cells(1,1)には担当者の名前が入ります。
しかし、担当ごとに条件はございません。

また、厚かましくて恐縮ではございますが、いくつか質問をさせてください。

1つめは 
 
>  ws2.Range("A5:BD" & iLast * 6 + 4).ClearContents

マクロの実行を行うとこちらの式でエラーが出ました。
範囲をA5:BD35と指定をしても同じようにエラーが出ます。
何か解決策はありますでしょうか。


2つめに

>    'If (ws1.Cells(a, 4).Value = "カット" Or ws1.Cells(a, 4).Value = "カラー") _
>    And ws1.Cells(a, 14).Value = "予約可" Then
>    'よくわからないのでとりあえずコメントアウト
>      For j = 1 To 2
>        For i = 1 To iLast
>          Set rng = ws2.Cells(i * 6 - 1, j * 4 - 3 + clmnplus)
>          If rng.Value = "" Then
>            rng.Value = ws1.Cells(a, 6).Value
>            ws2.Cells(rng.Row + 2, rng.Column + 3).Value = ws1.Cells(a, 4).Value
>            GoTo 脱出
>          End If
>        Next
>      Next
>    'End If

こちらの条件式で実行をした場合に”トリートメント”予約の方も出てきました。
作成いただいた表はカットとカラーを抽出したいのですが、もとのCSVデータには(a,4)にトリートメントの方も含まれております。どのようにすれば指定できるのでしょうか。

最後に同じ時間帯の枠(例えば9;15の枠の中)の中で、
同じ方が繰り返し入ってきました。
この繰り返しを止める方法はございますでしょうか。

ご面倒ばかりおかけして申し訳ございません。
ご指導のほどよろしくお願いします。

【81860】Re:次の列に続けて同じ処理を繰り返す方法
回答  山内  - 21/7/5(月) 14:35 -

引用なし
パスワード
   >1つめは 
> 
>>  ws2.Range("A5:BD" & iLast * 6 + 4).ClearContents
>
>マクロの実行を行うとこちらの式でエラーが出ました。
>範囲をA5:BD35と指定をしても同じようにエラーが出ます。
>何か解決策はありますでしょうか。

元のコードからselectionを省略しているだけなので原因不明です。
エラーメッセージの内容を教えてください。


>2つめに
>
>>    'If (ws1.Cells(a, 4).Value = "カット" Or ws1.Cells(a, 4).Value = "カラー") _
>>    And ws1.Cells(a, 14).Value = "予約可" Then
>>    'よくわからないのでとりあえずコメントアウト
>>      For j = 1 To 2
>>        For i = 1 To iLast
>>          Set rng = ws2.Cells(i * 6 - 1, j * 4 - 3 + clmnplus)
>>          If rng.Value = "" Then
>>            rng.Value = ws1.Cells(a, 6).Value
>>            ws2.Cells(rng.Row + 2, rng.Column + 3).Value = ws1.Cells(a, 4).Value
>>            GoTo 脱出
>>          End If
>>        Next
>>      Next
>>    'End If
>
>こちらの条件式で実行をした場合に”トリートメント”予約の方も出てきました。
>作成いただいた表はカットとカラーを抽出したいのですが、もとのCSVデータには(a,4)にトリートメントの方も含まれております。どのようにすれば指定できるのでしょうか。

カットやカラー、トリートメントがどういう条件で分けるのか不明なため条件を時間だけに絞ってほかはコメントアウトしているからです。
コウさんのコードでわかる条件は
1.カットもしくはカラーである。12時である。予約可である。
2.カットもしくはカラーである。12時である。要確認である。
3.カラーもしくはトリートメントである。12時ではない。
この3つだけです。
回答者からすると「じゃぁトリートメントで12時のときは?カットで12時以外のときは?」となるわけです。
条件分けするとき(特に自分以外がコードを見る必要がある時)は条件を漏れなく書きましょう。


>最後に同じ時間帯の枠(例えば9;15の枠の中)の中で、
>同じ方が繰り返し入ってきました。
>この繰り返しを止める方法はございますでしょうか。
>
>ご面倒ばかりおかけして申し訳ございません。
>ご指導のほどよろしくお願いします。

同じ人が繰り返し入る場合はつまりws1に重複したデータが複数行入っているということです。
重複したデータを削除してから実行してください。

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