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

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

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

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

Q&A

解決済

vbaの「実行時エラー'1004':'Range'メソッドは失敗しました: '_Global'オブジェクト」について

KM46
KM46

総合スコア17

VBA

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

2回答

0グッド

0クリップ

5252閲覧

投稿2019/06/14 12:08

前提・実現したいこと

vbaで任意の列を検索し、その列を並び替えたいです。

発生している問題・エラーメッセージ

実行時エラー'1004': 'Range'メソッドは失敗しました: '_Global'オブジェクト

該当のソースコード

vba

1Sub 並びかえマクロ() 2 3  Dim 変更年月日列 As Variant 4 変更年月日列 = Range("1:1").Find("変更年月日").Column 5 6' 変更年月日を昇順に並び替え 7 8 ActiveWorkbook.Worksheets("指定したシート名").AutoFilter.Sort.SortFields.Clear 9 ActiveWorkbook.Worksheets("指定したシート名").AutoFilter.Sort.SortFields.Add Key:= _ 10 Range(変更年月日列, 2), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ 11 xlSortNormal 12 With ActiveWorkbook.Worksheets("指定したシート名").AutoFilter.Sort 13 .Header = xlYes 14 .MatchCase = False 15 .Orientation = xlTopToBottom 16 .SortMethod = xlPinYin 17 .Apply 18 End With 19 20End sub

シート構造

列 頭|列 頭|列 頭|列 頭|列 頭|列 頭|列 頭|列 頭|列 頭| データ|データ|データ|データ|データ|データ|データ|データ|データ| データ|データ|データ|データ|データ|データ|データ|データ|データ| データ|データ|データ|データ|データ|データ|データ|データ|データ|

事前に指定した値をvbaで設定→それを1行目で検索→該当する列を並び替える ということがやりたいです。

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

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

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

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

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

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

回答2

3

ベストアンサー

記事タイトルのエラーは、以下の行で発生したものと想定して回答します(エラーが発生したのであれば、発生場所を質問に記載した方が回答がされやすいです)。

vba

1ActiveWorkbook.Worksheets("指定したシート名").AutoFilter.Sort.SortFields.Add Key:= _ 2 Range(変更年月日列, 2), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ 3 xlSortNormal

まず、エラーの理由はRangeプロパティの使い方が間違っている、渡している引数が適切でないためです。

vba

1Range(変更年月日列, 2)

Range プロパティ (Excel) | Microsoft Docs

Worksheet オブジェクトの Range プロパティは以下の引数の組み合わせしか受け取りません。

  • 引数が1個のときは、A1 形式のセルのアドレスの文字列("A1"など)を1個

(Range("A1"), Range("5:5")など)

  • 引数が2個のときは、A1 形式のセルのアドレスの文字列、または任意のRangeオブジェクトのいずれかを2個(混ぜて指定してもOK)

(Range("A1", "C3"), Range("A1", Cells.Item(3, 3)), Range(Cells.Item(1), "C3"), Range(Cells.Item(1), Cells.Item(3, 3))など)

そして、質問のRange(変更年月日列, 2)の記述では、変更年月日列Long2Integerとなり、両方とも整数となっています。

整数は文字列に暗黙的に変換できますが、「A1 形式のセルのアドレスの文字列」にはならないため、上記の組み合わせに当てはまりません。
結果として引数が間違っていることになり、Range プロパティが失敗します。

行・列の番号を指定してセルを取得したいのであれば、Cells.Item(行, 列)を使うのが一般的でしょう。


その他気になったところ
親のシートの明示

問題の箇所や、最初のRange("1:1")に関しては、今の記述だと最前面のシートを対象にしているため、親のWorksheetを明示した方が良さそうに思います。

オブジェクト変数の使用

ActiveWorkbook.Worksheets("指定したシート名")と毎回書いていますが、長くて面倒な上に、VBA側の編集補助機能が無効化されてしまいます。

vba

1Dim targetWs As Worksheet 2Set targetWs = ActiveWorkbook.Worksheets("指定したシート名")

のように変数に入れておくと、以下のように短く記述でき、targetWs以降についても入力補完が使えるようになります。

vba

1targetWs.AutoFilter.Sort.SortFields.Clear

投稿2019/06/15 01:09

imihito

総合スコア2164

KM46, ExcelVBAer, TanakaHiroaki👍を押しています

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

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

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

0

ミスにより削除しました。

投稿2019/06/18 10:26

編集2019/06/18 11:55
KM46

総合スコア17

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

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

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

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

VBA

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