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

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

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

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

Q&A

解決済

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

pomiw0000
pomiw0000

総合スコア19

VBA

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

2回答

0グッド

0クリップ

340閲覧

投稿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列にくるのですが、そのうしろの列が空白の場合それ以降の列が消えていないという現象が起きています。
列名がない場合、列としてみなしてくれないのでしょうか。
イメージ説明

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答2

1

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

総合スコア670

pomiw0000👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

pomiw0000

2022/12/08 07:20

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

1

ベストアンサー

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

総合スコア32038

pomiw0000👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

pomiw0000

2022/12/08 07:20

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

VBA

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