[[20191220171344]] 『実行時エラー424の対処方法』(sysk) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『実行時エラー424の対処方法』(sysk)

 "実行時エラー424""オブジェクトが必要です。"と表示され、ネット等で解決策を調べたところ、Setを入れることで解決できることまでは分かったのですが、下記のように入力しても同じエラーメッセージが出てきます。
 超素人の質問で申し訳ありませんが、どなたか原因と対策を教えて頂けないでしょうか。

 '変数r,rngをRange型,wsをWorksheet型で宣言
    Dim r As Range
    Dim rng As Range
    Dim ws As Worksheet
    Set ws = Worksheets(5)
 '"当月払出し数量"欄をコピー
    Range("M22:U33").Select
        Selection.Copy
 'セルU22を基準に表の右端のセルの列番号を変数rに代入
    Set rng = ws.UsedRange.Columns(ws.UsedRange.Columns.Count).Column
 '"当月払出し数量"欄を表の一番右端のセルに貼付
    Range(22, rng + 1).Select
        ActiveSheet.Paste
    Application.CutCopyMode = False

 よろしくお願い致します。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


rng はRange型オブジェクト変数として宣言しているけど、代入しているのはColumnプロパティであり、
これはオブジェクトではなく単なる整数値です。Range型に整数代入しているから、そのエラーになっているのですね。
整数なのかオブジェクトなのか、ごちゃ混ぜにしているのが問題です。

rngをlong型にすれば、その行は通りますが、次の行が意味不明なので、別のエラーになる事でしょう。
やりたい事が、1列ずらして別シートにコピーする事であるならば、以下の1行で済んだりしませんか?

    Worksheets(5).Range("M22:U33").Copy ActiveSheet.Range("N22")
(???) 2019/12/20(金) 18:17

 >???さん

 ご回答ありがとうございます。また、返信が遅れてしまい申し訳ありません。

 ご教示頂きました、rngの型をInteger,Long等に変えてみても、今度は"コンパイルエラー""オブジェクトが必要です"と表示されて上手くいかないため、他にもおかしいところがあるようなのですが、恥ずかしながらその箇所を特定できません。

 やりたい事としては、M22:U33で指定した範囲を、実行する度に同一シートの現在の表の一番右端にコピーしていく(実行する度に表が拡大していく)、といった動作になります。

 実行する度にペーストする箇所が変わるためUsedRangeプロパティを使おうとしているのですが使い方がどうもよく分かりません。

 お手数ですがご教示をお願い致します。
(sysk) 2019/12/23(月) 10:01

 Range("M22:U22")に 空白セルがないことが条件ですが

 下記のコードで試してください

 Sub test()

    With Worksheets(5)
        .Range("M22:U33").Copy .Range("U22").End(xlToRight).Offset(, 1)
    End With
    Application.CutCopyMode = False

 End Sub

(渡辺ひかる) 2019/12/23(月) 10:34


>渡辺ひかるさん

 ご回答ありがとうございます。

 教えて頂いたのに大変恐縮ですが…当方でEnd(xlToRight)も試してみたものの、上記のようなコードだと1回は上手く動作するのですが、2回目以降が上手くいきません。

 Range("M22:U33")には空欄の方が多くなるため、空欄があっても使えそうなUsedRange.Columnsを使用するのが解決の糸口かと思っておりました。

 大変申し訳ありませんが、他にいい方法があればご教示頂けないでしょうか。よろしくお願い致します。
(sysk) 2019/12/23(月) 13:58

 Sub test()
    Dim myClmCnt As Long
    Dim i As Long
    With Worksheets(5)
        myClmCnt = .Range("M22:U33").Columns.Count

        i = -1
        Do
            i = i + 1
            If WorksheetFunction.CountA(.Range("U22").Offset(myClmCnt * i).Resize(, myClmCnt)) = 0 Then
                .Range("M22:U33").Copy .Range("U22").Offset(myClmCnt * i).Offset(, 1)
                Exit Do
            End If
        Loop Until .Range("U22").Column + myClmCnt * (i + 1) > .Columns.Count
    End With
 End Sub

では?

(渡辺ひかる) 2019/12/23(月) 15:33


Sub main()
    Dim r As Range
    Dim ws As Worksheet
    Set ws = Worksheets(5)
    Set r = ws.Range("M22:U33")
    Do
        Set r = r.Offset(, r.Columns.Count)
        If WorksheetFunction.CountA(r) = 0 Then ws.Range("M22:U33").Copy r: Exit Do
    Loop
End Sub
(mm) 2019/12/23(月) 15:49

 >渡辺ひかるさん

 度々の返信ありがとうございます。

 やはり最初の1回は上手く動作するのですが、2回目以降が上手くいきません。

 >mmさん

 ご回答ありがとうございます!

 上記のコードで動作実現致しました!ありがとうございます。あとは実用に沿って細かいところを修正して使わせていただきたいと思います。

 ご回答下さいました皆様、本当にありがとうございました。
(sysk) 2019/12/23(月) 18:38

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.