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

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

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

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

Q&A

解決済

4回答

1821閲覧

シートの最終列番号取得(.UsedRange)

ice930

総合スコア99

VBA

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

0グッド

0クリップ

投稿2020/08/06 13:13

シートに記載された最終列の番号を取得したく、以下のコードを作成しました。

Dim r As Range Dim last As Range Set r = Worksheets("城").UsedRange.Select last = Range("r").Column

ステップインで確認すると1行目は機能していて、2行目は「オブジェクトが必要です」と表示されます。
rは範囲(Range)なので機能すると思ったのですが・・・

改善方法、アドバイスいただければありがたいです。
よろしくお願いします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

vba

1 Dim r As Range 2' Dim last As Range 3' 列番号は数値なので Range型ではなく、Long型 4 Dim last As Long 5 6' Set r = Worksheets("城").UsedRange.Select 7' .Select が不要、Select はメソッド(選択するという動作)であってオブジェクトではない 8 Set r = Worksheets("城").UsedRange 9 10' last = Range("r").Column 11' Range("r") などという指定はできない 12 last = r.Columns(r.Columns.Count).Column

最終列の番号取得には他にもいろいろな方法があります。
また、注意点もあります。下記に詳しく解説されています。

最終行・最終列の取得方法(End,CurrentRegion,SpecialCells,UsedRange)|VBA技術解説

上記でも解説されてますが、UsedRange だと書式を設定(罫線とか背景色等)すると、そこも範囲になります。
データが入力されている領域の最終列ということなら、CurrentRegion を使った方かいいでしょう。

投稿2020/08/06 13:22

編集2020/08/06 13:55
hatena19

総合スコア33699

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

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

ice930

2020/08/06 13:30

回答ありがとうございます。 Set r = Worksheets("城").UsedRange last = Range("r").Column のバージョンも試したのですが、「Rangeメソッドが失敗しました」となってしまいます。 原因に心当たり有りませんでしょうか。。。
ice930

2020/08/06 14:02

とても丁寧な回答ありがとうございます! 理解しながらコードを記入できました! ご教授いただいたサイトも参考にさせていただきます。 ありがとうございました!
guest

0

下記コードで正しく動きます。

Dim r As Range Dim last As Range Set r = Worksheets("城").UsedRange last = r.Columns(r.Columns.Count)

質問者様のコードがエラーになる原因

1.Set r = Worksheets("城").UsedRange.Select
まず、これは.Selectの戻り値がRangeオブジェクトではないためエラーが発生します。

2.last = Range("r").Column
まず、Range("r")と()内に"r"を入れていますが、これはアドレスとして不正な文字列なのでエラーになります。
おそらく、変数rのセル範囲を参照したかったのだと思いますが、使い方を勘違いされているようです。
そして、.Columnの戻り値はLong型であり、列番号を返すメソッドであるため、Range型の変数に代入できません。

投稿2020/08/06 13:56

ELBE

総合スコア305

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

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

hatena19

2020/08/06 14:01

Dim last As Range は Dim last As Long ですよね。 「Range型の変数に代入できません。」といわれてますので編集忘れですね。
ice930

2020/08/06 14:07

今後は戻り値やオブジェクトの種類に注意しながらコードを打とうと思います。 分かりやすい解説助かります! ありがとうございました!
ELBE

2020/08/06 14:07

.Column の戻り値はLong型ですが、 .Columns の戻り値はRange型です。 ただ、どのみちコードに誤りがありますね。 誤)last = r.Columns(r.Columns.Count) 正)Set last = r.Columns(r.Columns.Count)
hatena19

2020/08/06 14:15

あ、そうですね。 質問では最終列の番号の取得ということなので、 Dim last As Long last = r.Columns(r.Columns.Count).Column の方が適していますね。
guest

0

少し情報が足りない気がします。
シートに記載された最終列の番号とありますが、

Worksheets("城").UsedRange.Select

というコードの場合、例えばデータの始まりがB2セルで始まった場合、
1行目とA列は範囲選択から無視されます。その上で、指定された範囲内の列番号が必要なのか、
それともA1から数えた列番号が欲しいのか…その辺りが曖昧です。

また、必ずA1からデータがスタートし、空欄などもなくデータが並んでいるのであれば、
質問者さんの方法でなくとも

VBA

1Dim l as Variant 2Range("A1").End(xlToRight).Select 3l = Selection.Column

などで一番右端の列が取得できるのでこのように列番号を拾ってやればいい気もします。
なんとなくですが、質問者さんのやりたいことはこのサイトに記載されている内容で解決しませんか?

https://www.tipsfound.com/vba/09002

投稿2020/08/06 13:47

編集2020/08/06 13:49
phiar_poet

総合スコア230

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

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

ice930

2020/08/06 13:59

回答ありがとうございます。 空欄の多い少し変わった表でしたので、今回は「UsedRange」を使用しておりました。 とても分かりやすいサイトを紹介いただきありがとうございます!
guest

0

アクティブシートの最終セルの列番号の例です。

VBA

1ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count - 1

投稿2020/08/06 13:44

meg_

総合スコア10579

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

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

ice930

2020/08/06 14:00

このコードは思いつきませんでした! 次回参考にさせていただくかもしれません。 回答ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問