Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2010)
Cellsの行が「アプリケーション定義またはオブジェクト定義のエラー」で止まる
投稿日時: 19/09/19 01:38:46
投稿者: shcom

EXCEL VBA初級者(初心者?)です。
任意のセル範囲にある数値を、行単位で昇順並べ替えをするマクロを作ろうとしています。任意の先頭列と最終列を入れて出来るようにしたいと思ったのですが、何故かCellsのある行で「アプリケーション定義またはオブジェクト定義のエラー」で止まってしまいます。列番号を0にしてるとか、あり得ないセル位置になってる訳ではないようです。
Cellsの列を具体的数値にしてコーディングしたものは動くのですが、引数を使って任意の列を指示しようとすると、前記エラーで止まります。何故なのか、どうすると良いのか、お判りになる方はご教授下さい。よろしくお願いします。
 
■■■Cellsのある行でエラーで止まるマクロ■■■
Sub 行の数値の昇順並べ替え()
' 行の数値の昇順並べ替え
 
    Dim i, RS, RE, CS, CE As Integer
    CS = InputBox("先頭列数は?")
    CE = InputBox("最終列数は?")
    RS = InputBox("先頭行数は?")
    RE = InputBox("最終行数は?")
 
' ▼RS行目からRE行目まで繰り返す
    For i = RS To RE
        With ActiveSheet.Sort
' ▼並べ替えの条件をクリア
            .SortFields.Clear
' ▼並べ替えの条件を指定(CS列目基準、値で並べ替え、昇順、テキストを数値データとして並べ替え)
            .SortFields.Add _
                Key:=Cells(i, CS), _
                SortOn:=xlSortOnValues, _
                Order:=xlAscending, _
                DataOption:=xlSortTextAsNumbers
' ▼CS列〜CE列並べ替えの実行
            .SetRange Range(Cells(i, CS), Cells(i, CE))
            .Header = xlNo ' 先頭をタイトルとみなさない
            .MatchCase = False ' 大文字小文字を区別しない
            .Orientation = xlLeftToRight '左から右へ
            .SortMethod = xlPinYin ' 並べ替えにふりがなを使う
            .Apply
        End With
    Next i
End Sub
 
■■■参考:ちゃんと実行できるマクロ(列を具体的数値)■■■
Sub 行の数値の昇順並べ替え()
' 行の数値の昇順並べ替え
 
    Dim i, RS, RE As Integer
    CS = InputBox("先頭列数は?")
    CE = InputBox("最終列数は?")
    RS = InputBox("先頭行数は?")
    RE = InputBox("最終行数は?")
 
' ▼RS行目からRE行目まで繰り返す
    For i = RS To RE
        With ActiveSheet.Sort
' ▼並べ替えの条件をクリア
            .SortFields.Clear
' ▼並べ替えの条件を指定(3列目基準、値で並べ替え、昇順、テキストを数値データとして並べ替え)
            .SortFields.Add _
                Key:=Cells(i, 3), _
                SortOn:=xlSortOnValues, _
                Order:=xlAscending, _
                DataOption:=xlSortTextAsNumbers
' ▼3列〜16列並べ替えの実行
            .SetRange Range(Cells(i, 3), Cells(i, 16))
            .Header = xlNo ' 先頭をタイトルとみなさない
            .MatchCase = False ' 大文字小文字を区別しない
            .Orientation = xlLeftToRight '左から右へ
            .SortMethod = xlPinYin ' 並べ替えにふりがなを使う
            .Apply
        End With
    Next i
End Sub

回答
投稿日時: 19/09/19 08:37:20
投稿者: simple

エラーになったときに、デバッグボタンを押して、
ローカルウインドウで変数の中身を確認してみてください。
 
>Dim i, RS, RE, CS, CE As Integer
としたとき、IntegerなのはCEだけであとはVariantです。
Inputboxから返るのは文字列なので、
(数値に変換されずに)そのまま行や列の指定に使われるからじゃないですか?
 
面倒でもひとつひとつ型を指定する必要があります。

投稿日時: 19/09/19 13:21:41
投稿者: shcom

>simpleさん、ありがとうございます。
カーソルを変数のところに近づけると、ポップアップで値が出るみたいで、それをみるとちゃんと数値は入ってました。ただし型はわからないです。
アドバイスいただいたように型宣言を変えてみますね。後ほど結果はアップします。

回答
投稿日時: 19/09/19 13:39:38
投稿者: simple

ローカルウインドウです。
数値と文字列が区別できるはずです。
よく調べてください。

投稿日時: 19/09/19 14:13:53
投稿者: shcom

>simpleさん、ありがとうございます。
勉強になります。
今までローカルウィンドウなんて使ったことがありませんでした。
 
それに今まで
>Dim i, RS, RE, CS, CE As Integer
みたいな型宣言で、このようなエラーになったことが無かったので、
てっきりコレで良いと信じ込んでました。
,(カンマ)つなぎじゃ、全ての変数が型定義さるわけではなく、一番最後の変数しか効かないのですね?
初歩的なことで、お恥ずかしい。
過去に作ったマクロも変えなくちゃです。
 
ローカルウィンドウで確認したら、仰る通り、CE以外は全てVariantでした。
 
型宣言を一つ一つ以下のように変えたら、動きました。
    Dim i As Integer
    Dim RS As Integer
    Dim RE As Integer
    Dim CS As Integer
    Dim CE As Integer
 
ありがとうございました。
これに懲りず、機会がありましたら、またお教え下さい。