[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『「オブジェクトが必要です」とエラーが出て困っています。』(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
「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
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
で、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
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
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
私の提示したコードにコメントも返さない。 あなたとの話はかみ合いそうもないので、私のコメントは全て忘れてほしい。 (seiya) 2018/03/09(金) 15:54
(amaryllis) 2018/03/09(金) 16:07
もし、こんな風に直してみたけど他にも修正したほうが良い箇所がありますか?
という聞き方であれば、
(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
シンプルにできるマクロなんか、なかなか思い付きませんでした。
勉強不足な私で申し訳ございません。
「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.