🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

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

Q&A

2回答

744閲覧

VBAでテーブル作成する範囲の右下について

robben

総合スコア12

VBA

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

0グッド

1クリップ

投稿2021/03/20 08:20

●困っていること
対象範囲をテーブル化し、ピボットテーブルを作りたいです
pivotcaches.create(xldatabase,"テーブル1").createpivottables............
と書く前のテーブル化をする部分で、困っています。
(ちなみにテーブル化にしといた方が、pivotcaches.createの構文のsourceの引数で、楽になると聞き、テーブル化にしています)

テーブル化するには、

ListObjects.Add(xlSrcRange, Range("A3:***), , xlYes)と書く必要があると思いますが、
上記の構文2つ目の引数sourceについて。
テーブル化したい範囲を入れるのですが、範囲の右下(一番右列の最終行)の位置(***の部分)を指定する方法がわかりません。最終列はわかっています。X列です。
開始位置(左上)は、どんな場合も、A3で決まっています。
X列に空欄セルはありません。

●試したこと
dim a
a = range("X3").end(xldown).row
ListObjects.Add(xlSrcRange, Range("A3:X" & a), , xlYes)

初歩的な質問だと思いますが、どなたか教えていただけないでしょうか。

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

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

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

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

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

xail2222

2021/03/20 09:27

そのプログラムは、どこに書いていますか? シートのモジュールの中ですか? それとも標準モジュールですか? またテーブルは作れないようですが、処理を実行するとどうなるのですか? 何も起こらないのですか? 何かエラーでも発生するのでしょうか?
robben

2021/03/23 12:01

私の質問に目を通し、、お力になろうとしてくれたにもかかわらず、申し訳ございません。 xail2222様に聞かれていることがよく理解できず、また、私の質問の投稿の仕方も悪く、うまく返信ができませんでした。 大変申し訳ございません。 ちなみに、標準モジュールに書いており、エラーが出ていました。 既に、他の方のご回答で、エラーの原因がわかりました。 ありがとうございました。 今後もよろしくお願いします。
xail2222

2021/03/23 13:51 編集

なるほど。標準モジュールだったのですね。 標準モジュールに書く場合の書き方と、シートのモジュールに書く書き方には違いがあって シートのモジュールに書いているなら初めのコードでも動くんじゃないかなと思っていました。 つまり私が推測していた原因は、標準モジュールに書く場合の書き方になっていない。ということでした。 (実際にはカッコが余計だったという問題もあったみたいですね) エラーの原因がわかったのであればよかったと思います。 お返事ありがとうございました。
guest

回答2

0

CurrentRegion を使えば自動でテーブル範囲を取得してくれますので、下記の1行ですみます。

vba

1ListObjects.Add xlSrcRange, Range("A3").CurrentRegion, , xlYes

End(xlDown)で最終行の取得だとデータがなかったり、空欄があったりすると正しい範囲にならない場合があります。


作成したテーブルを変数に代入すると、それ以降、テーブルを操作するときに、楽できます。
例えば、デフォルトのテーブル書式(TableStyle)を消したいときとか、下記のように記述できます。

vba

1 Dim ws As Worksheet, lo As ListObject 2 Set ws = ThisWorkbook.Worksheets(1) 3 4 Set lo = ws.ListObjects.Add(xlSrcRange, ws.Range("A3").CurrentRegion, , xlYes) 5 lo.TableStyle = ""

投稿2021/03/21 02:59

hatena19

総合スコア34073

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

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

jinoji

2021/03/21 04:36

CurrentRegion は、たとえばA1,A2セルなどに何かが書かれている場合には、 そこを含んだ範囲が取得されてしまうので、注意が必要だと思います。
robben

2021/03/21 05:13

ありがとうございます。 currenregionを使えば、楽ですね。 jinojiさんが言うように、A1A2などが空欄であることを前提として、使えばいいのですね。
hatena19

2021/03/21 06:05

そうですね。できればテーブルにするときは、見出しとデータだけにしておいた方が扱いやすいとは思います。 A3より上に何かあることも考慮すると、下記のような感じでしょうか。 Dim rng As Range Set rng = ws.Range("A3").CurrentRegion Set rng = Intersect(rng, ws.Range("3:" & Rows.Count)) Set lo = ws.ListObjects.Add(xlSrcRange, rng, , xlYes)
guest

0

いまどういう状態になって困っているのかわかりませんが、
まずはこんな感じでどうでしょう。

VBA

1 Dim ws As Worksheet, lo As ListObject 2 Set ws = ThisWorkbook.Worksheets(1) 3 Dim a 4 a = ws.Range("X3").End(xlDown).Row 5 Set lo = ws.ListObjects.Add(xlSrcRange, ws.Range("A3:X" & a), , xlYes) 6

wsの指定は状況に合わせて変えてください。
A3:X3は見出し行だと推測します。(xlYesとあるので)
データ行が1行もない場合はaの値がシートの最下端になりますが、
まあ実際にはそんなことはないと割り切れるならこのままでもいいと思います。

投稿2021/03/20 23:35

jinoji

総合スコア4592

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

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

robben

2021/03/21 02:03

jinojiさん ありがとうございます。テーブルになりました。これで、範囲の右下を設定できます。 ただ、最後に、 変数 lo に代入してますが、これを変数に入れる意味は何があるのでしょうか? ちなみに、変数に入れないと、コンパイルエラー 修正候補:=になります。 くだらない質問でしたら、すみません。
jinoji

2021/03/21 02:07

入れない場合は、 ws.ListObjects.Add xlSrcRange, ws.Range("A3:X" & a), , xlYes とカッコが不要になります。
robben

2021/03/21 05:08

ありがとうございます。変数に入れる場合は、引数たちは括弧に入れる必要があるということですね。
jinoji

2021/03/21 05:14

そういうことです。 pivotcaches.createの構文のsourceの引数にすることを見越してテーブルにするということなら、変数に入れるのが自然かなと思い、そのように書きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問