アプリ版:「スタンプのみでお礼する」機能のリリースについて

29列ある表なんですが、その内見出しと対応するチェックボックスにチェックが入っていた場合その列を削除して表を詰めたいのですが、うまくいきません。(きれいに削除になりません。)何か方法はないでしょうか。

Rem 非出力項目を非出力にする
For i = 1 To 29
If .Cells(1, i).Text = "AAA" And Frm設定.ChkAAA.Value = 1 Then .Columns(i).Delete
If .Cells(1, i).Text = "BBB" And Frm設定.ChkBBB.Value = 1 Then .Columns(i).Delete
If .Cells(1, i).Text = "CCC" And Frm設定.ChkCCC.Value = 1 Then .Columns(i).Delete
If .Cells(1, i).Text = "DDD" And Frm設定.ChkDDD.Value = 1 Then .Columns(i).Delete
If .Cells(1, i).Text = "EEE" And Frm設定.ChkEEE.Value = 1 Then .Columns(i).Delete
中省略(全部で12項目あります)
Next i

A 回答 (2件)

こんばんは。



カウンター、i を1ずつアップしながら確かめてみれば分かると思いますが、
提示のコードのように単純にループして列(行)を削除する時は、
最終列(行)の方から始まりの方へループしないと拙いです。

  For i=1 to 29

ではなくて、

  For i=29 to 1 step -1

としましょう。
 
    • good
    • 0
この回答へのお礼

すばらしい。うまく動きました。助かります。

お礼日時:2007/04/22 00:18

おそらくなのですが、列を削除すると、列カウンタがずれてしまうのでは?



例)
  i = 3 の場合、Column(3).Delete → 3列目を削除して、4列目が3列目に移動する
  i = 4 の場合、Column(4).Delete → 4列目を削除したつもりが、実質は元の5列目を削除してしまう。

ということで、ループカウンタと、列カウンタを別々に分けてみてはいかがでしょうか?

例)
col = 1

For i = 1 to 29
  If .Cells(1, col).Text = "AAA" And Frm設定.ChkAAA.Value = 1 Then
    .Columns(col).Delete
  Else
    col = col + 1
  End If

  以下同文
Next i

実際の動作確認はしていませんが。。。参考になれば幸いです。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

お礼日時:2007/04/22 00:19

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