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

ExcelのVBAについての質問

nishi6の回答

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.7

添付図を見ての感想ですが、まず、インデントをちゃんと付け、処理の切り替わりは空白行を入れるとかして、見やすくすべきです。 Worksheet_Changeイベントの中にシート2(Sheet2)に何かをする行が見当たりません。「time7.Offset(0, 4).Value =・・・」がSheet2に対する処理ではありませんよね。 これが回答を考える上で、一番の疑問点です。「Application.EnableEvents = True」も不思議で、元々Trueのはずで、意味がないでしょう。「time7.Offset(0, 4).Value」がSheet1に書き込んでいるのであれば、Worksheet_ChangeイベントがWorksheet_Changeイベントの中で呼び出されます。かなり危ない動きになります。最初に「Application.EnableEvents = False」を書くべきです。 Sheet1では、セルA3への変更が処理の起点になっているように思えますが、「For Each time7 In Target」となっているため、複数セルを選択して変更すると、(Targetは複数セルになり)複数セルの中のA列がChangeイベントを呼び続け、スタックオーバーフローを起こしかねません。 Worksheet_Activateイベントの中で、セルH3、セルE3を更新していますが、その都度Worksheet_Changeイベントが実行されます。状況によってはスタックオーバーフローなどでフリーズします。1行挿入しているようですが、これもChangeイベントを呼び出します。「Application.EnableEvents = False」と「Application.EnableEvents = True」をこのイベントの最初と最後に書くべきです。 str_Left = Left(Cells(4, 5), Cells(4, 8)) もよく分かりません。コメントと関連が切れたのでしょうか。よくあります。 上記は、Sheet1でChangeイベントを起こし、手動でSheet2をアクティブにし、手動でSheet1をアクティブにして気が付いた問題点です。 また、コーディングの中にセル番地やOffsetの引数が「実際の値」として書かれています(Offset(0, 4)、H3、E3、Cells(4, 5)、Cells(4, 8)など)。このような書き方は、マジックナンバーと言います。コーディングが完成に近づくほど、変更が面倒になります。シートの方で1行、1列の挿入・削除で誤作動したり、動かなくなったりします。マジックナンバーはなるべく使わない方がいいでしょう。回避方法としては、セルに名前を付けるのが簡単です。セルの挿入や削除に強いコードになります。 2つのシート間で入力、出力を行いたいらしいので、そのヒントですが、  Dim ws1 As Worksheet   '// Sheet1  Dim ws2 As Worksheet   '// Sheet2  Set ws1 = Worksheets("Sheet1")  Set ws2 = Worksheets("Sheet2") のようにセットし、RangeやCellsには明示的にws1やws2を付けることでシート間の移動が不要になったりします。実際、Worksheet_Activateイベントはほとんど使ったことがありません。(本当は使ったことがありません) 例えば、Changeイベントの「time7.Offset(0, 4).Value = Format(…」をSheet2の同じセルに書きたいときは、「ws2.Range(time7.Address).Offset(0, 4).Value = Format(…」とします。読んでみると「Sheet2の、セルtime7と同じ番地のセルから右に4つ動いた同じ行に右辺を書く」となります。至極当然の書き方です。 コードを書いているのはSheet1のコードウインドウなので、操作するセルの住所(シート:WorkSheetとセル座標:Range)を明確にセットし記述するようにすれば、Sheet2に書いて→Sheet1で処理をして…→… がActivateイベントなしで書けるはずです。 当方、Win10、Excel2010です。ご参考に。

seijiadb07
質問者

お礼

助言ありがとうございます。マジックナンバーの点ですが、試用中ですらややこしく、最初の頃は間違って使っていました。今も他のアドレスとで違和感があります。できれば何れかという1つを使いたいですが、、まだまだ勉強中です^^ メッセージボックスですが、作った本人は分かりますが、間違いはないだろうが、動きをつけてます。どこを自動的にして手動はどのあたりにするか? 今日はこれにて。ありがとうございます^^

関連するQ&A

  • ExcelのVBAについて。

    ExcelのVBAについて。 普通は数値を表形式にまとめて図表化しますが、図表化した値から数値の表形式に直せないでしょうか? 例えば、図表化する時に入力項目をファイルに落とすとかして、のちに再集計するなど。あくまでExcelで完結したやり方としてです。よろしくお願いします! 質問としては、転記の基本などもご指導頂ければ有り難いです。入力、転記については、先に表形式にすべきと酷評もあるかと思いますが、よろしくお願いします。

  • エクセルvba初心者です・・・

    エクセルvba初心者です・・・ シート1にあるひとつのセルをコマンドボタンを押した時にそのセル内の文字列をシート2にかいていくようなプログラムをつくりたいです。 例えば シート1のセルに文字入力→”田中”→登録ボタンおす→シート2のセルA1にはいる シート1のセルに文字入力→”竹山”→登録ボタンおす→シート2のセルA2にはいる                  ・                  ・                  ・ というようになるコードわかる方いたら教えてください。おねがいします。

  • エクセルVBA(マクロ)の書き方で・・・

    VBA初心者です。よろしくお願いします。 エクセルマクロで、次のような関数を入力して、 =IF(月!$D4=稼動シート!$B$2,月!B4,"◆") 自動記録をさせると コードは、次のような「絶対参照セル」(←表現あっていますか?)の表示になります。 『Range("C4").Select ActiveCell.FormulaR1C1 = "=IF(月!RC4=稼動シート!R2C2,月!RC[-1],""◆"")"』 わたしのスキルでは、この記述コードを参考に別のコードを書こうにも理解と応用が効きません。 そこで、VBAコードにも 『Range("C4").Select  =IF(月!$D4=稼動シート!$B$2,月!B4,"◆")』 と単純に書いてはいけないのでしょうか?また、どうすれば実際のシートで入力した関数と同じような表現でVBAにもかけるのでしょうか? ご指導お願いいたします。

  • 急!!Excel VBA 転記マクロを教えて下さい

    Excel VBA超初心者です、 急ぎ作らなければならない資料があり、ご助力願います。 次の様な転記するアクションをコマンドボタンに設定したいです。 Sheet1の列A(先頭セルA2)に入力したデータを、 追加した(入力間違い等を除き、保存した)データ分だけ Sheet2の列B(先頭セルB3)の最終行から転記させていく。 列Aに入力したデータは、並び替えをするので (この分は、今回のVBAに含みません。入力・転記後、Sheet1で普通に並び替えをします。) 列Aと列Bのデータの順番が異なる。 以上です。 どうぞ宜しくお願いします。

  • エクセルVBA及び関数

    初心者です。お教えお願いします エクセル2003です 空白行及び0をなくしたいのですが(C列を入力された時点で自動でE列のようにしたい) 関数の場合及びVBAのシートコードを両方教えていただけないでしょうか VBAのコードは勉強の為です Sheet1    A    B     C     D     E     F 16          文字A        文字A 17          文字B        文字B 18            0         文字C 19          文字C        文字D 20            0         文字E 21          文字D        文字F      22      23          文字E 24 25          文字F 文字はC16~C80まで入っております B16~E80までのセルのみで行いたいのですが 他の場所は関数やグラフ等がすでに入ってますのでいじりたくありません E16~をフォームのコンボボックスのリストにしようと思ってます よろしくお願いましす

  • VBA教えてください

    VBA初心者です A1~A5までのセルは色は白色のセル A6.A7セルの色は赤色の背景のセルです A1~A5までのセルは B~Dのセルに数値を入力するが A6.A7のセルのB~Dまでのセルは 結合してさらに結合したセルに「停止」 の文字を入力します。 私がVBAでやりたいのは 赤い背景のセルだけに反応して 自動でB~Dのセルを結合し 停止の文字を自動入力できるようにしたいです コードを書いてくれると めちゃくちゃ助かります 回答お願いします。

  • Excel VBA データの転記

    Excel2003を使用しています。 Sheet1のB1セルとSheet2のB1セルのデータが一致したら、Sheet2のB1セル~E1セルのデータをSheet1のF1セル~Iセルに転記するというコードを書いています。 Sheet1のデータ最終行を取得して、上記の条件を満たさなかったSheet2のB1セル~E1セルのデータをSheet1のデータ最終行の1行下から順に転記するという内容を追加したいのですが、転記先の指定の仕方が悪いのか、希望通りになりません。 どなたか一例を示していただけないでしょうか? スマホからの投稿で、実際に書いているコードを記載できず、分かりづらくて申し訳ないのですが、よろしくお願いします。

  • エクセルシートの塗りつぶしをVBAでやるには?

    エクセルのセル塗りつぶしについて(VBA) いつもお世話になっています。 エクセルシートで、任意のセルに数値を入力したとき、入力したセルから右側に向けて、その数値分、自動で塗りつぶすようにしたいのですが、どのようにすれば良いのでしょうか? 色は何でも構いません。 画像添付します。

  • Excel VBAについての質問です

    シート1のセルA1で文字が入力されたら3つ下へ(A4へ)、A4で文字が入力されたら3つ下(A7へ)…としたいのですが、どうすれば良いのですか? VBAを使う方法と使わない方法をそれぞれ、もしくは一方を教えて頂きたいのですが、よろしくお願いします。

  • エクセルでデータを蓄積するVBA

    蔵書管理用の一覧表です。 エクセルでデータ入力用のフォームは作ることができたのですがシートに転記するVBAをどのように書けばよいのか分かりません。 データは次々に増えていきます。 A列には番号を入力せずに自動的に番号が増えていくようにしたい。 3番まで入力済みのあとは、自動で「4」と番号が付与されて、下の行に転記されるようにしたい。 VBA初心者です。よろしくお願いします。 A    B      C          D 番号 分類     図書名      冊数 1   文庫本    日本の歴史   3 2   週刊誌    新潮        1 3   月刊誌    月刊ゴルフ    1