Excel VBA質問箱 IV

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

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


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

【72680】異なった内容のDo Loop を続けて使用する場合 はってんちゅう 12/9/5(水) 11:22 質問[未読]
【72681】Re:異なった内容のDo Loop を続けて使用す... kanabun 12/9/5(水) 11:45 発言[未読]
【72682】Re:異なった内容のDo Loop を続けて使用す... kanabun 12/9/5(水) 11:55 発言[未読]
【72683】Re:異なった内容のDo Loop を続けて使用す... はってんちゅう 12/9/5(水) 14:04 質問[未読]
【72684】Re:異なった内容のDo Loop を続けて使用す... kanabun 12/9/5(水) 14:27 発言[未読]
【72685】Re:異なった内容のDo Loop を続けて使用す... はってんちゅう 12/9/5(水) 14:45 質問[未読]
【72686】Re:異なった内容のDo Loop を続けて使用す... kanabun 12/9/5(水) 17:29 発言[未読]
【72687】Re:異なった内容のDo Loop を続けて使用す... kanabun 12/9/5(水) 18:49 発言[未読]
【72688】Re:異なった内容のDo Loop を続けて使用す... はってんちゅう 12/9/5(水) 19:41 お礼[未読]
【72692】Re:異なった内容のDo Loop を続けて使用す... kanabun 12/9/5(水) 21:54 発言[未読]
【72693】Re:異なった内容のDo Loop を続けて使用す... はってんちゅう 12/9/6(木) 9:39 お礼[未読]

【72680】異なった内容のDo Loop を続けて使用する...
質問  はってんちゅう  - 12/9/5(水) 11:22 -

引用なし
パスワード
   表の中にデータの管理担当ごとに集計用のコラム挿入を行うためのモジュールを作っています。
Do Loop を使っています。

問題は、
3つの Do Loop を続けて並べ、実行すると最初のDo Loopしか反応しません。
各一つずつの実行は問題なく意図した通りになるのですが。

どうすれば3つとも実行されるようになるのでしょうか。

どうぞよろしくご教示ください。お願いいたします。


以下はその作ったものの条件です。

1.8行目に各コラムにあるデータの担当先が明記。
 ただし、一つの製品に対し2つのコラムを使用しているので、管理担当先は一つ置きに明記となっている。
(例:DEが一製品分でDのみに管理担当者明記、FGが一製品分でFにのみ管理担当者明記となっている)
2.9行目にはすべてのコラムに言葉が入っているので、条件として9行目セルに言葉がなくなったら、LOOP終了とした。
3. 管理担当者はとりあえず3社:S-A / S-F / S-B

それで作ったものが以下。
Dim i As Integer
Dim j As Integer
Dim x As Integer
Dim y As Integer
Dim m As Integer
Dim n As Integer
Dim z As Range
Dim firstaddress As String
  
'ユニット毎合計作る
rtn = MsgBox("ユニット別合計を作成しまぁす ☆ ", vbOKCancel)
If rtn = vbOK Then
  Windows("損益付替表作成.xls").Activate
 
  i = 4 'Column ユニット名用
  j = 4
  Do
    If Cells(8, i) = "SY-A" Then
      If Cells(8, i + 2) = "SY-F" Then
        Columns(i + 2).Select
        Selection.Insert Shift:=xlToRight
        Cells(8, i + 2).Select
       End If
      i = i + 2
      j = j + 1
    End If
    i = i + 2
    j = j + 1
  Loop Until Cells(9, j) = ""
    

    x = 4 'Column ユニット名用
    y = 4
    Do
      If Cells(8, y) = "SY-F" Then
        If Cells(8, y + 2) = "SR-B" Then
          Columns(y + 2).Select
          Selection.Insert Shift:=xlToRight
          Cells(8, y + 2).Select
         End If
        y = y + 2
        x = x + 1
      End If
      y = y + 2
      x = x + 1
    Loop Until Cells(9, x) = ""

  
  m = 4 'Column ユニット名用
  n = 4
      Do
        If Cells(8, n) = "SR-B" Then
          If Cells(8, n + 2) = "" Then
            Columns(n + 2).Select
            Selection.Insert Shift:=xlToRight
            Cells(8, n + 2).Select
          End If
          n = n + 2
          m = m + 1
        End If
        n = n + 2
        m = m + 1
      Loop Until Cells(9, m) = ""
   
Else
MsgBox "中止しました"
Exit Sub
End If

MsgBox "Fin Unit Total"

【72681】Re:異なった内容のDo Loop を続けて使用...
発言  kanabun  - 12/9/5(水) 11:45 -

引用なし
パスワード
   ▼はってんちゅう さん:

>集計用のコラム挿入を行う

列の挿入(削除も)は 右から左へ、
行の挿入削除は 下から上へ
というのが、定石です。

【72682】Re:異なった内容のDo Loop を続けて使用...
発言  kanabun  - 12/9/5(水) 11:55 -

引用なし
パスワード
   8行目 いちばん右から 順に左へ調べていき、
セルの値が "S-A", "S-B", "S-F", "SY-A", "SY-F", "SR-B" の
どれかなら、2列右に 列挿入しています。

Sub Try1()
  Dim col As Long 'コラム用
  Dim colZ As Long '最後のコラム
  
  colZ = Cells(8, Columns.Count).End(xlToLeft).Column
  For col = colZ To 4 Step -1 '最終列から4列目まで右から
    Select Case Cells(8, col).Value
     Case "S-A", "S-B", "S-F", "SY-A", "SY-F", "SR-B"
       Columns(col + 2).Insert
    End Select
  Next
    
End Sub

【72683】Re:異なった内容のDo Loop を続けて使用...
質問  はってんちゅう  - 12/9/5(水) 14:04 -

引用なし
パスワード
   kanabun さん:

アドバイスありがとうございます。

このSelect Case使用ですと、管理担当者(SY-A等)は複数存在するので、
SY-A担当になっているコラムの横すべてにコラム挿入されてしまいますよね。

管理担当別に製品は複数並んでいるので、それぞれの管理担当の最終製品のコラムの右に管理担当の合計算出の為のコラムを挿入したいのです。
その順番は、SY-A、SY-F、SR-Bです。

このため、Ifを使っていたんですが。

以下、簡易に表したデータ表の配列です。

A B C D E F G H I J K L M N....コラム
あ  か  さ  た  な  は  ま ....製品名 7行目
○  ○  ○  ●  ●  ●  ◎ ....管理担当 8行目
1 2 3 4 5 6 7 8 9 10 11 12 13 14 ....必ず明記のある言葉 9行目

【72684】Re:異なった内容のDo Loop を続けて使用...
発言  kanabun  - 12/9/5(水) 14:27 -

引用なし
パスワード
   ▼はってんちゅう さん:

>このSelect Case使用ですと、管理担当者(SY-A等)は複数存在するので、
>SY-A担当になっているコラムの横すべてにコラム挿入されてしまいますよね。
そうです。
>
>管理担当別に製品は複数並んでいるので、それぞれの管理担当の最終製品のコラムの右に管理担当の合計算出の為のコラムを挿入したいのです。

>以下、簡易に表したデータ表の配列です。
>
>A B C D E F G H I J K L M N....コラム
>あ  か  さ  た  な  は  ま ....製品名 7行目
>○  ○  ○  ●  ●  ●  ◎ ....管理担当 8行目
>1 2 3 4 5 6 7 8 9 10 11 12 13 14 ....必ず明記のある言葉 9行目

では、Sub Try1() を修正して、以下のようにしてください。
作業はやはり一番右から左に、と遡っていきます。

Sub Try2()
  Dim col As Long 'コラム用
  Dim colZ As Long '最後のコラム
  Dim sOld As String, sNew As String

  colZ = Cells(8, Columns.Count).End(xlToLeft).Column
  For col = colZ To 2 Step -2 '最終列から2列目まで-2列Stepで
    sNew = Cells(8, col).Value
    If sNew <> sOld Then  '前の名前と違っていたら、
       sOld = sNew
       Columns(col + 2).Insert    '列挿入
    End If
  Next

End Sub

【72685】Re:異なった内容のDo Loop を続けて使用...
質問  はってんちゅう  - 12/9/5(水) 14:45 -

引用なし
パスワード
   kanabun さん:

早急なお返事をいただいて感謝いたします。

希望通りの挿入ができました。

どうもありがとうございました。

ちなみに、Do Loop系のものは、私が最初に書いたように連続して
使用はできないということでしょうか。

私の方法が間違っている理由がお判りでしたら、教えていただけますか。

【72686】Re:異なった内容のDo Loop を続けて使用...
発言  kanabun  - 12/9/5(水) 17:29 -

引用なし
パスワード
   ▼はってんちゅう さん:

>ちなみに、Do Loop系のものは、私が最初に書いたように連続して
>使用はできないということでしょうか。

Try2() の For〜Next Sampleを そのままDo〜Loopにすることはできます。
ただ、Loopの終了値があらかじめ分かっているばあいは
For〜Nextのほうがスマートですけど。

Sub DoLoop_Sample()
 Dim j As Long
 Dim sNew As String
 Dim sOld As String

'ユニット毎合計作る
  If MsgBox("ユニット別合計を作成しまぁす ☆ ", vbOKCancel) _
   = vbCancel Then
     MsgBox "中止しました"
     Exit Sub
  End If
 
  j = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列番号
  Do
    sNew = Cells(8, j).Value
    If sOld <> sNew Then
      sOld = sNew
      Columns(j + 2).Insert
    End If
    j = j - 2 '2列 左へ
  Loop Until j <= 2
  
End Sub

>
>私の方法が間違っている理由がお判りでしたら、教えていただけますか。

結局、i=4 で第1回目のLoopをはじめ、
 2列づつ調べていって ある列が "SY-A" で
 (i+2)列目が "SY-F" のとき i+2列目を挿入しますよね?
そうすると、つぎの「ある列が "SY-F" で (その+2列目)が "SR-B" である」
ような列は 1列挿入しているから、偶数列ではなく、奇数列になりますよね?

このように 行挿入すると、最初の番号関係がダイナミックに変わっていくので
単純にはいかないのです。

【72687】Re:異なった内容のDo Loop を続けて使用...
発言  kanabun  - 12/9/5(水) 18:49 -

引用なし
パスワード
   ▼はってんちゅう さん:

これはもうお遊びの領域なのですが、
あくまでも 「左から」Do〜Loopするとしたら、
こんな感じです:

Sub Sample3()
  Dim i As Integer
   
  'ユニット毎合計作る
  If MsgBox("ユニット別合計を作成しまぁす ☆ ", vbOKCancel) _
   = vbCancel Then
     MsgBox "中止しました"
     Exit Sub
  End If
  
  i = 4 'First Column
  Do
    If Cells(8, i).Value <> Cells(8, i + 2).Value Then
      Columns(i + 2).Insert
      i = i + 3
    Else
      i = i + 2
    End If
  Loop Until IsEmpty(Cells(8, i).Value)

End Sub

【72688】Re:異なった内容のDo Loop を続けて使用...
お礼  はってんちゅう  - 12/9/5(水) 19:41 -

引用なし
パスワード
   kanabun さん:

色々とご説明やバージョンを示して頂いて、とてもありがたく
感謝いたします。

どうもありがとうございました。

また、お世話になる機会があると思いますのでお勉強させていただきたいと
思います。

こういうことの知識を増やしたり調べたりするのによい本ってあるのでしょうか。

いつもネットやこちらを利用してなんとかかんとか作ることばかりで、
基礎知識にかけることでぶつかる問題も多いので。

ご紹介いただけたら嬉しいです。

【72692】Re:異なった内容のDo Loop を続けて使用...
発言  kanabun  - 12/9/5(水) 21:54 -

引用なし
パスワード
   ▼はってんちゅう さん:

>こういうことの知識を増やしたり調べたりするのによい本ってあるのでしょうか。

本はあると思うけど、程度が分からないこともあるし、
最近はWeb検索でよいページがたくさんあるから、それで済んじゃう
ことが多いですね。

それより、このスレッドの問題(条件付き列挿入)は 勉強のためには
とてもいい問題だから、

>>私の方法が間違っている理由がお判りでしたら、教えていただけますか。

>結局、i=4 で第1回目のLoopをはじめ、
> 2列づつ調べていって ある列が "SY-A" で
> (i+2)列目が "SY-F" のとき i+2列目を挿入しますよね?
>そうすると、つぎの「ある列が "SY-F" で (その+2列目)が "SR-B" である」
>ような列は 1列挿入しているから、偶数列ではなく、奇数列になりますよね?
>
>このように 行挿入すると、最初の番号関係がダイナミックに変わっていくので
>単純にはいかないのです。

まず、なぜ右から列挿入は難しいのか、←ここを理解してください。

【72693】Re:異なった内容のDo Loop を続けて使用...
お礼  はってんちゅう  - 12/9/6(木) 9:39 -

引用なし
パスワード
   kanabun さん:

右から挿入の問題点、kanabunさんの私のモジュールの問題点の説明で
理解できました。確かに私の書き方だと列挿入後にカウントが意図しているものと
ずれちゃいますね。そこに気づきませんでした。

kanabunさんのように丁寧に解説や他の方法を提示してくださるとほんと、一つの問題でたくさん知識がいただけて勉強になります。

書籍の件は、とりあえず今まで通り、一つ一つの問題に当たりながらWEBで探したりこちらでお世話になりながら行こうと思います。

どうもありがとうございました。
そしてこのWEB常用者として、今後ともどうぞよろしくお願いいたします。

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