• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:マクロのエラーについて)

マクロのエラーについて

このQ&Aのポイント
  • マクロを作成したBOOKでは、エラー無く動作し、テスト用に2番目の別BOOKのマクロ編集に貼り付けマクロ実行したところ、エラー1004が出ました。
  • 通常は原紙ファイルのシートにデータをコピー⇒貼り付け・保存、ピボットテーブルで集計したものを印刷し使用しています。
  • この作業をマクロ処理化したいのですが、社内にVBAの扱える人はおらず、外注の許可も出ないので自分で何とかしたいと思っています。

質問者が選んだベストアンサー

  • ベストアンサー
  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.2

色んな可能性が考えられるコードですが・・ 質問文中の > D列4行目(黄色)の同日付をセル結合、 行番号が画像では見えないため、ココが若干曖昧ではあります。 画像を見る限り、黄色のセルは1行目・・ですから。 ですので、黄色のセルが実は4行目、という事で話を進めます。 > なぜなのでしょうか? 単純に問題の行 > Range(Cells(4, セル範囲3), Cells(4, セル範囲4)).Select  ***ここでエラーです*** を処理しようとするときに、 変数「セル範囲3」に何も代入されていない(セル範囲3=空白)の状態だから、ですね。 つまり、この行について変数を「代入された数字に置き換えて」書くと、例えば     Range(Cells(4, 空白), Cells(4, 6)).Select VBAはこう判断してしまうのです。 「Cells(4, 空白)ってどこのことですか?」と言うことでエラーで止まるわけです。 代入されない理由は簡単で、 > For K = 1 To 100 > If Cells(4, 4 + K) <> Cells(4, 5 + K) Then だと、5列目(E列)から処理が始まってしまいますから、     セル範囲3 = 5 + K の処理を通らず、変数「セル範囲3」に数値を代入出来ていないからです。 ですので対処としては、 繰り返し処理に入る前に変数「セル範囲3」の初期値を決めてしまうのが早いですね。 なお、このままだと4列目(D列)が処理範囲に入りませんので、 この場合、     セル範囲3 = 4     For K = 0 To 100 としてやるのが解り良いでしょうか。 > K = 0 は不要です。 直後にForがありますので、すぐに「K=1」に書き換わってしまいますから。 コレでお望みの処理が(なんとか)動くはずです。 > ***この後5列目の同時間のセル結合をしたいのです**** 5「行」目の事でしょうか? だとすると、単純に  1)同じ処理をもう一度続けて書く  2)4~5行目を繰り替えし処理するようにFor~Nextを追加する のどちらかで可能です。 後者の場合、     For I = 4 To 5         セル範囲3 = 4         For K = 1 To 100             If Cells(I, 4 + K) <> Cells(I, 5 + K) Then                 '省略         Next K     Nezt I としてやると良いですね。 あとは、「入力されている右端のセルの列番号を取得」してやると 無駄な処理が省けて良いかと思いますよ。 今のままでも大丈夫だとは思いますけどね。 もう一つ、「変数名・変数型を宣言する癖」をつけておくと後が楽です。     Dim セル範囲3 As Integer    '変数「セル範囲3」は「整数型」ですよ。 と言った感じですね。 ちなみに、今回は単一シートについての処理ですから、 マクロを走らせる時に「処理したいシート」を画面に表示させておけば 「どのシートについての処理なのか」を無理に記述する必要性は薄いです (無論、書いておくに越した事はありませんが)。 マクロは「アクティブシートについて処理」したがるものですので アクティブシート内だけで処理が完了するのであれば指定しなくても大丈夫ですし、 > 原紙ファイルのシートにデータをコピー⇒貼り付け・保存 との事ですから、「シート名は可変=必ずしも同じシート名ではない」でしょうから それをいちいち指定するのも面倒な話です。

mie-t
質問者

お礼

さっそくご回答頂きありがとうございます。 なるほど、確かにデバッグとやらで、empty となっていた意味が分からず、ネットで調べても本を見ても分からず、困っていました。 ものすごく分かりやすかったです♪ 貴方のような方が社内にいてくれたら…心強いのですが。。。 関数のように単調な並びではないんですね…私に出来るか分かりませんが、アドバイス頂いたものをありがたく使用させて頂きながら、少しずつ理解できるように頑張りますっっ!! お忙しい中、丁寧にご教授頂きありがとうございました!! また分からなくなって手も足も出なくなったら、質問させて頂きますので、よろしくお願いいたします。

その他の回答 (1)

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.1

私もVBA割りと初めて間がない方なのですが、 これ、私も苦しみました。 諸先輩方のページを拝見するとよく書かれていることが 「…だろう」を排除すること ですね。 ソフトライトには管理力が求められる と、思いますが ヒューマンパフォーマンスありき の仕事は、よくないですよね。 拝見すると BASICの言語のサービスと、 ご自身の管理力に依存した 「省略」を、随所に見受けました。 で、ですね、 私がこの内容の壁から出た策についてですが、 どのシートのレンジなのかを「省略」しない これでした。 … With Sheets(¨対象シート名¨)   .Range(.Cells(4,セル範囲3), .Cells(4,セル範囲3)).Select ……… …… … … … End With … … これも一例ですね。 前に何もつかない「.」は With文の内容を引き継ぎます。 BASICは随所で このWith文がないような場合でも 補うよう、サービスをしてくれれますが、 それはあくまで予測 絶対じゃないものと 思った方がいいかもしれませんね。 アクテイブシートが変わる要因としては ・他で動くエクセルアプリ ・ユーザーの操作 ちょっと考えても幾つも挙げられますよね。 その環境毎で、言うまでもなく バージョンも設定も違うはずです。 それらの違いを 管理し、補えるよう、するべきことはちゃんと宣言する。 これが必要だと、感じましたよ。 如何でしょうか? お役に立てていたならば幸いです。

mie-t
質問者

お礼

そうなんですね、補ってくれてたなんて…(*^^*) With 、とっても参考になりました。 もう迷わせないように、さっそく宣言を癖づけようと思います♪ お忙しい中、ありがとうございました!!

関連するQ&A

専門家に質問してみよう