質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

2576閲覧

VBA:対象の列以外の列を一括削除したい

pomiw0000

総合スコア19

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2022/12/08 05:29

編集2022/12/08 05:50

実現したいこと

エクセルのシートが何枚かあり、
それぞれのシートから残したい対象の列名の列数を取得し、
(前提として全てのシートに対象の列名が必ず存在しています)
その対象列以外削除したい ということを実現したいです。

以下のコードで実行してみたところ、
エラーは出ないのですが対象の列以外がちゃんと削除されているシートと
削除されていないシートがあるため
原因をご教示いただけますでしょうか。

該当のソースコード

VBA

1Sub test() 2 3 4Dim i 5Dim apple 6Dim banana 7Dim r As Long 8Dim j As Long 9Dim s As Variant 10Dim f As Boolean 11Dim LastClm As Long 12 13'「Sheet1」の後ろのシートに処理をする 14For i = Worksheets("Sheet1").Next.Index To Worksheets.Count 15 Worksheets(i).Select 16 17 18 '対象の列を変数に保持する 19 '列名がりんごの列数取得 20 apple= Worksheets(i).Rows(1).Find(What:="りんご", LookAt:=xlPart).Column 21 22 '列名がばななの列取得 23 banana = Worksheets(i).Rows(1).Find(What:="ばなな", LookAt:=xlPart).Column 24 25 '削除したくない列の列番号 26 s = Array(apple, banana) 27 28 Application.ScreenUpdating = False 29 30 31 '最終列を取得 32 LastClm = Worksheets(i).Range("A1").End(xlToRight).Column 33 34 '全列をループ 35 For r = LastClm To 1 Step -1 36 37 '配列ループ 38 For j = 0 To UBound(s) 39 40 '削除したくない列かどうかチェック 41 If r = s(j) Then 42 f = True 43 End If 44 45 46 Next j 47 48 '削除したい列だったら削除 49 If f = False Then 50 Worksheets(i).Columns(r).Delete 51 Else 52 'フラグをFalseに戻す 53 f = False 54 End If 55 56 57 Next r 58 59 Application.ScreenUpdating = True 60 61 62Next i 63End Sub

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

他の列が消えていないシートの共通点として、
対象の2列は前2列にくるのですが、そのうしろの列が空白の場合それ以降の列が消えていないという現象が起きています。
列名がない場合、列としてみなしてくれないのでしょうか。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Range("A1").End(xlToRight)

はctrl+→と同じ挙動なので空白セルで止まります。

Worksheets(i).Cells(1,Columns.Count).End(xlToLeft).Column

で一番右の列を取得するところですが、見たところ最後尾のデータに列名が空白になってしまってる可能性もありそうですね。ということなので

LastClm = Worksheets(i).UsedRange.columns.count

で使用している全セルの右端を取得してしまってもいいかも。

Deleteするってことは書式が消えてしまっても困らないということだと思うので列名が空欄になってたとしても(書式だけ設定されてる空白列だとしても)確実に消せますね

投稿2022/12/08 06:28

pig_vba

総合スコア807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pomiw0000

2022/12/08 07:20

コメントありがとうございます。 ぜひ参考にさせていただきます!
guest

0

ベストアンサー

vba

1 '最終列を取得 2 LastClm = Worksheets(i).Range("A1").End(xlToRight).Column

途中に空白セルがある場合は、上記のコードだと空白セルの前の列を取得します。
途中の空白セルを無視して最終列を取得するなら、下記のコードになります。

vba

1 '最終列を取得 2 LastClm = Worksheets(i).Cells(1,Columns.Count).End(xlToLeft).Column

どうせ削除するときに最終列からループするので、
Findで探して配列に格納してなどと面倒なことをせずとも、
ループするときに1行目の値を確認すればすみます。
そうすれば下記のようなシンプルなコードになります。

vba

1Public Sub test() 2 Dim i As Long 3 For i = Worksheets("Sheet1").Next.Index To Worksheets.Count 4 With Worksheets(i) 5 Dim j As Long 6 For j = .Cells(1, Columns.Count).End(xlToLeft).Column To 1 Step -1 7 Select Case .Cells(1, j).Value 8 Case "りんご", "ばなな" 9 Case Else 10 .Columns(j).Delete 11 End Select 12 Next 13 End With 14 Next 15End Sub

投稿2022/12/08 06:17

編集2022/12/08 06:33
hatena19

総合スコア33742

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pomiw0000

2022/12/08 07:20

ご丁寧にありがとうございます。 最終列の取得、配列をしようしなくてもできる点参考にさせていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問