プロが教える店舗&オフィスのセキュリティ対策術

ExcelのVBAのセル範囲について、1セルだけの場合、列だけ複数の場合、行だけ複数の場合、範囲が広範囲、4列5行の場合、別シートの場合、
それをCells(1,1)のように表したいです

あるシートの一部にある表を複数の全てのシートを作りながらコピペ実行の時の高速化ができるVBAの作り方に行き詰っております
セルひとつひとつのはできたのですが、完了までにとても時間がかかります

お助け下さい

質問者からの補足コメント

  • うーん・・・

    dimを省略させていただいて、
    Application の ScreenUpdatething、Calculation、EnableEvents は設定してます

    Sheets("設定").Range("N:AW").Copy
    .range("A1").select
    Activesheet.paste
    Activesheet.Range("B8").value = wdate
    'dim で作ったwdateで割り出した日時をB8セルにて表現する
    Activesheet.Range("B:B").Interior.ColorIndex = 0
    Activesheet.Range("A3") = ""
    Activesheet.Range("A7") = ""

    --------------------------->activesheetから始まる個別セルはもっと簡潔になりますか?

      補足日時:2024/01/05 19:25
  • うーん・・・

    Range("$A$1:$P$292").PasteSpecial Paste:=xlPasteColumnWidths '列幅コピー
    Range("$A$1:$P$292").PasteSpecial Paste:=xlPasteFormats '書式コピー
    Application.CutCopyMode = False
    --------------------------->Range("$A$1:$P$292")は表ですが配列にさせたい気持ちがあります。

      補足日時:2024/01/05 19:33
  • つらい・・・

    .Orientation = xlLandscape
    .FitToPagesTall = False
    .FitToPagesWide = 1
    .Zoom = False
    .PrintArea = "$A$1:$P$292"
    .PrintTitleRows = "$1:$7"'
    .HeaderMargin = Application.CentimetersToPoints(0)
    .FooterMargin = Application.CentimetersToPoints(0)
    .CenterHorizontally = True
    .CenterVertically = False

    --------------------------->さらに余白設定を加えようと思うのですが、「設定」シートの一部になる表に印刷設定すれば省略できるところがあるのではないか(今のところ見つけられません)

      補足日時:2024/01/05 19:40
  • どう思う?

    最後にfor next 文の中に
    ・設定シートB列「祝日リスト」の個数を調べるwith 文
    ・何枚シートを作り繰り返すかループする for next 文(一ページを何行にするかを設定するfor next 文が入れ子としてあり)
    ・印刷設定をする with 文
    ・セル名にある曜日でセルに色を付ける if 文

    が並列になって存在しております。 並列を少なくしたいです。合わせられたらうれしいです。

    と、改善点がありましたらご教授ください。よろしくお願いいたします。

      補足日時:2024/01/05 19:49
  • どう思う?

    Sheets("設定").Range("N:AW").Copyはコピー前
    Range("$A$1:$P$292")はコピー後
    同一表のことです。

      補足日時:2024/01/05 19:58
  • つらい・・・

    全体が長かったので、画像で申し訳ありませんが載せさせていただきます。

    「ExcelのVBAのセル範囲について」の補足画像6
      補足日時:2024/01/05 22:48
  • 見えますでしょうか。やはりおっしゃる通り何がしたいかわからない感じですか?

    「ExcelのVBAのセル範囲について」の補足画像7
      補足日時:2024/01/05 22:50
  • つらい・・・

    画像はご覧になられたでしょうか。
    つたないもので申し訳ありません。

    No.2の回答に寄せられた補足コメントです。 補足日時:2024/01/05 22:54
  • うーん・・・

    遅くなりまして申し訳ございません。
    あれから結局本日№3を拝見させていただくまでそのままで行っておりました。
    「設定」という実際使う範囲をすでに作った元となる表を設けておりますが、希望する書式設定を施してロックをかけただけでは、1か月分を作り上げた時にはやはり幅なり余白なりが希望通りにならず、書式関係の処理は必須になってしまってます。

    No.3の回答に寄せられた補足コメントです。 補足日時:2024/01/15 20:04

A 回答 (4件)

fukillinさんのおっしゃる通りとは思いますけど、別の言い方をするとマクロで処理するときに、書式関係の処理は出来るだけしないんですよ。



手作業で仕上げたシートをコピーすれば中身の値だけ必要に応じて変更するだけなので。
ちなみにここで言ったコピーはセルじゃなくてシートのコピー、つまりシート名タグを右クリックから移動とコピーのコピーのお話しです。

もう一つはコードを見て思います。
selectってほぼ要らない命令なんです。これはマクロ記録だとマウスで操作するから頻繁に出ますけどコードにはほぼ不要なんですよ。
コピペも滅多に使わないです。
range.copy
を検索したことは有りますか?
copyはもともと1行にコピー先が記述出来ます。
pastespecialで値だけ移したい場合は代入すれば1行です。
セル範囲の場合は左辺右辺の両方に.valueを付けます。
この辺を変えるだけでも、他の方だけじゃなく未来の貴方が読みやすいコードになると思いますけど。
    • good
    • 0

No2です。



補足の画像はなんとか読めますが、当方で打ち込んで確認する気にもなれないので、ざっと見ただけですけれど・・・

想像するところ、ほとんど同じ内容のシートを1か月分作成するもののように見受けられます。
処理内容としては、
 ①新規シートを作成
 ②セル範囲に値をコピペなど
 ③ページ区切りを設定
 ④印刷設定
 ⑤シート名と色を設定
のように見受けられます。
ご提示のコードはこれを日数分繰り返していますので、ほぼ「1シート作成時間」×30の時間を要します。

ざっと見る限り各シートで異なるのは、⑤の部分だけのようなので(他にもあるかも知れませんが)、1シート作成したらそれをまるっとコピーペしてシート名だけ設定するようにすれば、作成時間をかなり削減できるはずと思います。

更に言うなら、あらかじめセルの書式や印刷設定までをセットしたシートを「ひな形」として作成しておけば、「シートをコピーして名前を付ける」処理を日数分繰り返せば良いだけになるので、処理も単純化できるものと思われます。

シートのコピーはそのシートの内容によって、新規作成よりは時間がかかります。
当方の環境で試したところ、新規作成だけであれば30シート作成に要するのは0.2秒程度でした。
これに対して、簡単な値の設定のあるシートを30シート分コピペで作成するのには0.5秒程度でした。
更に、かなり複雑な計算式が数百行設定されているシートのコピペでは、30シートを作成するのに約4秒程度かかりました。
セットされた内容にもよりますが、内容的にはほぼご提示の処理と同等のことを行った場合と考えられます。
(PCの性能によって時間は変わるので、あくまでも目安ですが)
この回答への補足あり
    • good
    • 0

No1です。



他に回答がないようですので、No1の回答に補足なさっているおつもりと推測しますが・・

補足にご提示のコード(の断片)は構文的におかしな切り出しになっている上に、まともに動作もしないものなので、なさりたい内容も何のために提示しているのかすらわかりかねます。
セル位置の指定が沢山あるようですが、それをどうしたいのかもわかりません。

仮にセンテンスを書き換えたところで、同じことを行っている限りは実行速度には大きな差はでないものと思います。
(厳密には変わるでしょうけれど・・)

No1の回答の意味がまったく伝わっていないようですが、(再掲しますが)速度向上をなさりたければ、
 ・処理の考え方(=ロジック)
 ・無駄のない手順
が最も効果的な手段です。
確かに記述法でも若干変わる場合もありますが、どちらかと言えば些末なテクニックの範疇と言えます。


一方で、補足の仕方の雰囲気から勝手に想像すると・・
どうやら、個々のセンテンスの速度を上げることを期待なさっているように思われます。
もしも、それを実現なさりたいのなら、高速のCPUを利用するのが一番手っとり早い方法です。
現状がどのようなものをご利用なのか不明ですけれど、より高速なPC上で実行すれば確実に早く処理できることを期待できます。


※ 考え方や手順を変えることで実現できるという質問が最近ありましたので、No1の回答の意味の例示としてご参考までに。
(内容としては、処理速度の向上を図るものではありませんけれど・・)
https://oshiete.goo.ne.jp/qa/13699449.html
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとう

Excelを理解するところからやり直し、勉強していきたいと思います
ご指導ありがとうございました


今後もよろしくおねがいします。

お礼日時:2024/01/06 01:02

こんばんは



ご質問の内容がイマイチよくわかりませんけれど、文章にある通りとして・・

>それをCells(1,1)のように表したいです
Cells(n, m) の記述法は、基本的に一つのセルを表す記法です。
セル範囲を表すなら、一番簡単な方法は Range を用いて
 Range("A1:C10")
のような記法です。(上記はA1:C10の範囲を意味します)

可変にしたい場合は、Range(str) のようにしておいて、変数strの内容を変えることでも可能ですが、計算でセル位置を求めるような場合はA1記法よりも「n行m列」と行列の番号を用いる方が便利なことが多いです。
Range の記法を用いるなら、
 Range(Cells(n1, m1), Cells(n2, m2))
のように記すことも可能です。
この場合は、Cells(n1, m1) から Cells(n2, m2) までのセル範囲を意味することになります。
あるいは、左上のセルを基準にしてr行c列分のセル範囲という記述法を用いるなら
 Cells(n, m).Resize(r, c)
のような記述法もあります。
どれかにしなければならないということはなく、その時の処理に便利な方法を用いれば良いでしょう。


>全てのシートを作りながらコピペ実行の時の高速化ができる
>VBAの作り方に行き詰っております
実行速度の高速化の手法としてよく用いられるのは
 ・ディスプレイの再描画を一時停止する
 ・シートの再計算を一時停止する
などですが、それよりも一番効果的なのは
 ・無駄な処理を行わない
ことです。
処理の手順をよく考えて、無駄のない処理にすることで、高速化が図れるでしょう。

また、エクセルVBAの特徴として、
 ・シートへのアクセスに時間がかかる
ということがありますので、シートへのアクセス回数を減らすことでも高速化することが可能です。
わかりやすい例で言えば、セル範囲をコピーするのに1セルずつコピーするよりも、セル範囲をまとめて1回のコピペですませるだけでもかなりの高速化になります。

※ 実際になさりたいことがよくわからないので、一般的な範囲での回答になりますが、ご参考にでもなれば。
(具体的なコードを示せば、より適切な回答を得られるものと思います)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A