• ベストアンサー

VB6で指定したエクセルの列を削除したい。

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

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

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

noname#33277
質問者

お礼

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

その他の回答 (1)

noname#70726
noname#70726
回答No.1

おそらくなのですが、列を削除すると、列カウンタがずれてしまうのでは? 例)   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 実際の動作確認はしていませんが。。。参考になれば幸いです。

noname#33277
質問者

お礼

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

関連するQ&A