[[20180308152213]] 『「オブジェクトが必要です」とエラーが出て困ってい』(amaryllis) ページの最後に飛ぶ

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

 

『「オブジェクトが必要です」とエラーが出て困っています。』(amaryllis)

下記のマクロの「行番号 = 6」は、4回ループを使うために代入しています。
それをFox文を使うが、後回りして、下記のマクロで実行してみようとしているところですが、「オブジェクトが必要です」と出てしまい、できません。
どのようにオブジェクトを入れればいいですか?

Sub 次月へセルのコピー_最終列取得()

行番号 = 6

' セル「AJ6」の右端の列を取得
Set 最終列 = Range("AJ6").End(xlToRight).Column

Range(Cells(行番号, 最終列), Cells(行番号 + 6, 最終列)).Select

If 最終列 = 47 Then

    Application.CutCopyMode = False
    Selection.Copy
    Cells(行番号, 36).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone
Else
    Selection.AutoFill Destination:=Range(Cells(行番号, 最終列 + 1), Cells(行番号 + 6, 最終列 + 1)), Type:=xlFillDefault
    Range(Cells(行番号, 最終列), Cells(行番号 + 6, 最終列)).Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone
Next

End Sub

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 >Set 最終列 = Range("AJ6").End(xlToRight).Column
 これはObjectではないのでエラー
 Set キーワードを削除
(seiya) 2018/03/08(木) 15:37

 それと最後のNextはEnd If?
(seiya) 2018/03/08(木) 15:45

seiyaさん、回答をありがとうございます。

「NextはEnd If?」は修正済です。

「Set」を削除して、実行してみたら、今度は、「RangeクラスのAutoFillが失敗しました。」と出ました。
(amaryllis) 2018/03/08(木) 16:01


 それはデータが思うように配置されていないのでは?

 >Range(Cells(行番号, 最終列), Cells(行番号 + 6, 最終列)).Select

 > >Selection.AutoFill Destination:=Range(Cells(行番号, 最終列 + 1), Cells(行番号 + 6, 最終列 + 1)), Type:=xlFillDefault

 これ矛盾してませんか?
 最終列をつかんで、その右列でAutoFillしようとしてますね。
 しかも最終列の右側は空白では?

 何をしたいのか状況がつかめません。
(seiya) 2018/03/08(木) 16:34

seiyaさん、回答をありがとうございます。

AJ列〜AU列まで、4月〜3月までの表があります。

今月は2月で次月は3月ですが、3月(AU列)のセル内には空白になっています。
もちろん、4月になれば、5月以降のセルは削除し、空白になります(マクロは後で追加するので、質問したマクロには入っていません)。

オートフィルする前は式が入っています。
次月にオートフィルした後の今月は式から数値に切り替えます。
そのために
「Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone」にしています。

(amaryllis) 2018/03/08(木) 17:14


 >オートフィルする前は式が入っています
 どの様な数式ですか?
 最終列をコピーして右側にペーストできるような数式ですか?

 いずれにしても、AutoFillが妥当なのか判断できませんが...
(seiya) 2018/03/08(木) 17:27

≫どの様な数式ですか?
=$G$50のように絶対参照で他セルから拾って、グラフするための表になっています。

で、2月→3月の場合、
オートフィル前は2月の列では、「=$G$50」であるセルから拾って値が「10」とします。
オートフィルで、3月にコピーします。
これで「=$G$50」は2月と3月は同じになりますよね。
2月は「=$G$50」により「10」と表示されているのを値の貼り付けの 
「Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone」により、表示されている値の「10」が式から文字列の「10」に変えます。
これで、式の入っているのは3月の列だけになります。

あと、3月→4月へのコピーは下記のマクロは

 Application.CutCopyMode = False
    Selection.Copy
    Cells(行番号, 36).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone
↑
これ、間違えたので修正した。
3月の列をコピーして4月の列に貼り付けた後、3月の列を値の貼り付けで数値に変えるマクロに修正済みです。

(amaryllis) 2018/03/08(木) 20:09


 こんな感じだと思いますが?

 Sub 次月へセルのコピー_最終列取得()
 行番号 = 6
 '  セル「AJ6」の右端の列を取得 
 最終列 = Range("AJ6").End(xlToRight).Column
 With Range(Cells(行番号, 最終列), Cells(行番号 + 6, 最終列))
     If 最終列 = 47 Then
         Application.CutCopyMode = False
         .Copy
         Cells(行番号, 36).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone
         'ここは値貼り付けだと数式が無くなりますけど?
     Else
         .Copy .Offset(, 1)
         .Value = .Value
     End If
 End With
 End Sub
(seiya) 2018/03/08(木) 20:28

昨日、「3月→4月へのコピーは下記のマクロは 間違えたが、修正した」と言いましたが、修正内容は、
修正前
    Application.CutCopyMode = False
    Selection.Copy
    Cells(行番号, 36).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone
↓
修正後
    Selection.Copy
    Cells(行番号, 36).Select
    ActiveSheet.Paste
    Range(Cells(行番号, 最終列), Cells(行番号 + 5, 最終列)).Select
    Application.CutCopyMode = False
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone

そのマクロに修正し、動作確認済みです。
(amaryllis) 2018/03/09(金) 08:26


 >そのマクロに修正し、「動作確認済みです。」
 ならそれでいいんじゃないの?
(seiya) 2018/03/09(金) 10:04

>ならそれでいいんじゃないの?

だから、

Sub 次月へセルのコピー_最終列取得()

行番号 = 6

' セル「AJ6」の右端の列を取得
最終列 = Range("AJ6").End(xlToRight).Column

    Range(Cells(行番号, 最終列), Cells(行番号 + 6, 最終列)).Select

    If 最終列 = 47 Then
        Selection.Copy
        Cells(行番号, 36).Select
        ActiveSheet.Paste
        Range(Cells(行番号, 最終列), Cells(行番号 + 6, 最終列)).Select
        Application.CutCopyMode = False
        Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone
    Else
        .Copy .Offset(, 1)
        .Value = .Value
    End If

End Sub

これで良いか?と、聞いています。
(amaryllis) 2018/03/09(金) 10:40


質問内容を間違えた。
With文に対しての修正です。

Sub 次月へセルのコピー_最終列取得()

 行番号 = 6
 '  セル「AJ6」の右端の列を取得 
 最終列 = Range("AJ6").End(xlToRight).Column
 With Range(Cells(行番号, 最終列), Cells(行番号 + 6, 最終列))
     If 最終列 = 47 Then
         .Copy
         Cells(行番号, 36).Select
         ActiveSheet.Paste
         .Select
         Application.CutCopyMode = False
         .Copy
         Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone
     Else
         .Copy .Offset(, 1)
         .Value = .Value
     End If
 End With
 End Sub
(amaryllis) 2018/03/09(金) 10:50

 >これで良いか?と、聞いています。
 確認済んでるんならそれでいいと言っている。
 終わり。
(seiya) 2018/03/09(金) 11:14

動作確認は良いですが、気付いた点があります。
4月〜翌年2月からの次月へのコピーは問題ないですが、条件分岐により3月から4月へのコピーのマクロ実行終了後、見てみると選択範囲でコピーしたときに出る点線枠が出ていたままになっていました。
それをなくすにはどうしたら良いですか?
(amaryllis) 2018/03/09(金) 15:34

 私の提示したコードにコメントも返さない。
 あなたとの話はかみ合いそうもないので、私のコメントは全て忘れてほしい。
(seiya) 2018/03/09(金) 15:54

ごめんなさい。
.Copy .Offset(, 1)
Value = .Value

このコードだけで「.Select」を使わずに出来るのは、とてもうれしかったです。
良い勉強になったと感じています。
この問題が解決するまでの間、付き合いをこれからもよろしくお願いします。

(amaryllis) 2018/03/09(金) 16:07


自己解決しました。
ありがとうございました。
(amaryllis) 2018/03/09(金) 16:54

横から失礼します。私もVBA勉強中ですし、Seiyaさんが対応されてたんで、特にコメントしなかったですが、
>これで良いか?と、聞いています。
は、どうかなぁって思います。それを決めるのはご自身であって回答者ではないように思います。

もし、こんな風に直してみたけど他にも修正したほうが良い箇所がありますか?
という聞き方であれば、
(1)コード中で、変数なり、定数を定義しているところが見られない。
(2)〇〇を選択 → 選択したものを×× という不要な動きをさせている。
(3) たぶん、値だけがほしいからPasteSpecialメソッド使ってるんだろうけど、他にも手がある。
等々アドバイスがもらえたと思いますが・・・

気づいた範囲で私なりに修正してみたので、気が向いたら研究材料にしてみてください。
※テストデータが手元にないので、コンパイルエラーにならないことくらいしかチェックしてないです。

Sub Sample()
'==宣言など

    Const 行番号 As Long = 6
    Dim 最終列 As Long

'==処理部

    With ActiveSheet
         ' セル「AJ6」”からみて”右端の列"番号"を取得
        最終列 = .Range("AJ6").End(xlToRight).Column

        With .Range(.Cells(行番号, 最終列), .Cells(行番号 + 6, 最終列))
            If 最終列 = 47 Then
                .Parent.Cells(行番号, 36).Resize(1 + 6, 1).Value = .Value
            Else
                .Offset(, 1).Value = .Value
            End If
        End With
    End With
 End Sub
(もこな2) 2018/03/09(金) 17:45

失礼。こうでもいいのかも・・・(コンパイルエラーにはならない)

With .Range(.Cells(行番号, 最終列), .Cells(行番号 + 6, 最終列))

With .Cells(行番号, 最終列).Resize(1 + 6, 1)
(もこな2) 2018/03/10(土) 11:40


もう、解決済かもしれませんが。。。。

>『「オブジェクトが必要です」とエラーが出て困っています。』

オブジェクトとは、物体そのもののことです。

例えば、車。

「私の車のナンバーは?」

と問いたければ、

Msgbox Me.Car.Number

というような文法になります。

なので、

>Set 最終列 = Range("AJ6").End(xlToRight).Column

↑は、Endプロパティで得られるセル(Rangeオブジェクト)の
列番号を求めてます。
最後にColumnプロパティを書いているので、
最終的に返ってくるのは「列番号」です。
で、Setステートメントはオブジェクトを変数に代入するときのキーワードです。
なので、列番号(=数値)をオブジェクト変数に代入しようとしているので、
「代入しようとしているのがオブジェクトではないですよ。
オブジェクト(今回の場合はセル範囲)を代入してください。」
と注意してくれてます。

コードを読んで、

>AJ列〜AU列まで、4月〜3月までの表があります。
>今月は2月で次月は3月ですが、3月(AU列)のセル内には空白になっています。
>もちろん、4月になれば、5月以降のセルは削除し、空白になります
>(マクロは後で追加するので、質問したマクロには入っていません)。

こういうことがまったく書かれてないので、
「もちろん」とか「当然」とamaryllisさんは思っているかもしれませんが、
これは、実行するエクセル君も、回答者を含めてコードを読む人も、
そして何より、半年後、1年後に読むamaryllisさんも、
そういうことはわからない可能性大です。
そういうものも含めてコードに書いておくといいと思います。

Option Explicit

'月の繰り越し処理?
Sub test()

    Dim rngTarget As Range  '操作対象セル範囲
    Dim ix As Long          '列番号
    Dim vTemp As Variant    '最後のデータ

    '操作するセル範囲の定義
    Set rngTarget = ActiveSheet.Range("AJ6:AU12")
    '入力最終列番号の取得(データ数を数えれは列の相対位置がわかる)
    ix = WorksheetFunction.CountA(rngTarget.Rows(1))
    '最終データを変数に一時的に保持
    vTemp = rngTarget.Columns(ix).Value

    '転記先列番号の取得(基本次の列だけど、全部埋まっていたら、クリアして1列目)
    If ix = rngTarget.Columns.Count Then
        ix = 1
        'ついでに入力欄をクリア
        rngTarget.ClearContents
    Else
        ix = ix + 1
    End If

    '保持していたデータをセルに書き込む
    rngTarget.Columns(ix).Value = vTemp
End Sub

(まっつわん) 2018/03/11(日) 10:17


返事する事が遅くなってすみません。
もこな2さん、まっつわんさん、回答をありがとうございます。
明日、会社でやってみます。

シンプルにできるマクロなんか、なかなか思い付きませんでした。
勉強不足な私で申し訳ございません。

「Resize」や「CountA」を使ったことがなかったので、こういう使い方を知りませんでした。
上記以外にどんな時に使われるのですか?
(amaryllis) 2018/03/12(月) 23:56


>上記以外にどんな時に使われるのですか?
道具の使い方を知り、武器として使えるようになれば、
必要な時に引き出しから取り出すだけですね。

そのためには、経験と柔軟な発想(時には逆転の発想やプログラミング的発想から離れたり、
ご自分のさまざまな経験から発想する。)が必要です。

つまり、たくさんコードを書き(経験する)、
たくさん人が書いたコードを見る(いろいろな発想を学ぶ)ことが必要と思います。

そして、まずは日本語で処理の流れを書き出してみるところから始めてみてはいかがでしょうか。
あとはそれをVBA語に翻訳するだけです。

(まっつわん) 2018/03/13(火) 10:24


まっつわんさん、コメントをありがとうございます。

これからも、勉強していきます。
ありがとうございました。
(amaryllis) 2018/03/13(火) 10:32


コメント返信:

[ 一覧(最新更新順) ]


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