A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
fukillinさんのおっしゃる通りとは思いますけど、別の言い方をするとマクロで処理するときに、書式関係の処理は出来るだけしないんですよ。
手作業で仕上げたシートをコピーすれば中身の値だけ必要に応じて変更するだけなので。
ちなみにここで言ったコピーはセルじゃなくてシートのコピー、つまりシート名タグを右クリックから移動とコピーのコピーのお話しです。
もう一つはコードを見て思います。
selectってほぼ要らない命令なんです。これはマクロ記録だとマウスで操作するから頻繁に出ますけどコードにはほぼ不要なんですよ。
コピペも滅多に使わないです。
range.copy
を検索したことは有りますか?
copyはもともと1行にコピー先が記述出来ます。
pastespecialで値だけ移したい場合は代入すれば1行です。
セル範囲の場合は左辺右辺の両方に.valueを付けます。
この辺を変えるだけでも、他の方だけじゃなく未来の貴方が読みやすいコードになると思いますけど。
No.3
- 回答日時:
No2です。
補足の画像はなんとか読めますが、当方で打ち込んで確認する気にもなれないので、ざっと見ただけですけれど・・・
想像するところ、ほとんど同じ内容のシートを1か月分作成するもののように見受けられます。
処理内容としては、
①新規シートを作成
②セル範囲に値をコピペなど
③ページ区切りを設定
④印刷設定
⑤シート名と色を設定
のように見受けられます。
ご提示のコードはこれを日数分繰り返していますので、ほぼ「1シート作成時間」×30の時間を要します。
ざっと見る限り各シートで異なるのは、⑤の部分だけのようなので(他にもあるかも知れませんが)、1シート作成したらそれをまるっとコピーペしてシート名だけ設定するようにすれば、作成時間をかなり削減できるはずと思います。
更に言うなら、あらかじめセルの書式や印刷設定までをセットしたシートを「ひな形」として作成しておけば、「シートをコピーして名前を付ける」処理を日数分繰り返せば良いだけになるので、処理も単純化できるものと思われます。
シートのコピーはそのシートの内容によって、新規作成よりは時間がかかります。
当方の環境で試したところ、新規作成だけであれば30シート作成に要するのは0.2秒程度でした。
これに対して、簡単な値の設定のあるシートを30シート分コピペで作成するのには0.5秒程度でした。
更に、かなり複雑な計算式が数百行設定されているシートのコピペでは、30シートを作成するのに約4秒程度かかりました。
セットされた内容にもよりますが、内容的にはほぼご提示の処理と同等のことを行った場合と考えられます。
(PCの性能によって時間は変わるので、あくまでも目安ですが)
No.2
- 回答日時:
No1です。
他に回答がないようですので、No1の回答に補足なさっているおつもりと推測しますが・・
補足にご提示のコード(の断片)は構文的におかしな切り出しになっている上に、まともに動作もしないものなので、なさりたい内容も何のために提示しているのかすらわかりかねます。
セル位置の指定が沢山あるようですが、それをどうしたいのかもわかりません。
仮にセンテンスを書き換えたところで、同じことを行っている限りは実行速度には大きな差はでないものと思います。
(厳密には変わるでしょうけれど・・)
No1の回答の意味がまったく伝わっていないようですが、(再掲しますが)速度向上をなさりたければ、
・処理の考え方(=ロジック)
・無駄のない手順
が最も効果的な手段です。
確かに記述法でも若干変わる場合もありますが、どちらかと言えば些末なテクニックの範疇と言えます。
一方で、補足の仕方の雰囲気から勝手に想像すると・・
どうやら、個々のセンテンスの速度を上げることを期待なさっているように思われます。
もしも、それを実現なさりたいのなら、高速のCPUを利用するのが一番手っとり早い方法です。
現状がどのようなものをご利用なのか不明ですけれど、より高速なPC上で実行すれば確実に早く処理できることを期待できます。
※ 考え方や手順を変えることで実現できるという質問が最近ありましたので、No1の回答の意味の例示としてご参考までに。
(内容としては、処理速度の向上を図るものではありませんけれど・・)
https://oshiete.goo.ne.jp/qa/13699449.html
Excelを理解するところからやり直し、勉強していきたいと思います
ご指導ありがとうございました
今後もよろしくおねがいします。
No.1
- 回答日時:
こんばんは
ご質問の内容がイマイチよくわかりませんけれど、文章にある通りとして・・
>それを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回のコピペですませるだけでもかなりの高速化になります。
※ 実際になさりたいことがよくわからないので、一般的な範囲での回答になりますが、ご参考にでもなれば。
(具体的なコードを示せば、より適切な回答を得られるものと思います)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) シート間で同じ値があったら指定範囲をコピーして貼り付け 1 2022/11/07 08:01
- Visual Basic(VBA) vbaエクセルマクロ RemoveDuplicatesについて RemoveDuplicatesを使 3 2023/02/28 01:13
- Visual Basic(VBA) ExcelのVBAを使い、複数シートの同一箇所を、同一条件にて一括でソルバーを回す方法について 1 2022/04/23 11:49
- Visual Basic(VBA) ExcelVBAの複数指定範囲の構文 2 2022/05/26 22:39
- Excel(エクセル) エクセルの数式について ブック内の別シートの値の含まれたセルの個数を集計したい 全シート一覧のシート 1 2022/07/21 19:28
- Visual Basic(VBA) エクセルのマクロを教えてください 4 2022/02/04 08:05
- Excel(エクセル) エクセルのVBAで上の表の最下行を求める 4 2022/09/14 15:22
- Visual Basic(VBA) Excelのマクロコードについて教えてください。 1 2022/03/27 13:25
- Visual Basic(VBA) VBA 検索と入力 Excel ブック ぶぶぶ シート ししし 列V 検索対象の列です 最終行は、お 6 2023/05/17 01:40
- Excel(エクセル) Excel VBA 空白行があるセル範囲に色を付ける 3 2022/06/13 15:58
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
複数エクセルファイルの合成
Excel(エクセル)
-
Excelでこういう年を切り替えられる簡易なカレンダーを作ったのですが、 年や月を変えると、色が付い
Excel(エクセル)
-
同一セルに入力規則のリストと参照する設定併用できるような設定はありますでしょうか!!
Excel(エクセル)
-
-
4
Excelのマクロファイルを開くと下記のエラーがでます。
Excel(エクセル)
-
5
Googleシートでマクロ
Excel(エクセル)
-
6
VBAの高速化について
Excel(エクセル)
-
7
変数として取得した文字データの色の指定
Excel(エクセル)
-
8
エクセルでマクロでテキストデータを保存したい
Excel(エクセル)
-
9
ファイル名の日付について教えて頂けますかExcel
Visual Basic(VBA)
-
10
ExcelVBAのFindFirstエラーについて
Visual Basic(VBA)
-
11
マクロについて教えてください 下記のマクロはセル値「R18」の数字とフォルダ名の一部が該当した場合に
Excel(エクセル)
-
12
エクセルで相対パスの書き方を教えてください
Excel(エクセル)
-
13
エクセルマクロ 並び替え 手動設定した範囲の書き方
Excel(エクセル)
-
14
セルの結合の連続技
Excel(エクセル)
-
15
Excel 大なり小なりを表すとき、 例えば「10以上」なら、>=10 と表せますが、 この10の部
Excel(エクセル)
-
16
excelの不要な行の削除ができない!
Excel(エクセル)
-
17
excel access連携 このテーブルは空ですと表示
Excel(エクセル)
-
18
Excel VBAで、実行時にsheet上のコマンドボタンのCaptionを変更する。
Excel(エクセル)
-
19
データの入力規則 Excelです。 例えば、 C1セルに、 A列のデータ(B列にあいうえお"と入っ"
Excel(エクセル)
-
20
他人が作ったマクロの理解
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
日付が未入力の際はゼロか、空...
-
Excelの「0」だけ非表示、小数...
-
エクセルで1月0日と表示される!!
-
エクセルで条件に一致したセル...
-
Excelで複数シートの選択セルを...
-
Rangeメソッドは失敗しました。...
-
シート参照で変数を使いたい(EX...
-
エクセルで20万行あるシート...
-
(Excel)あるセルに文字を入力...
-
別シートのセルを絶対参照にする
-
Excelのファイル容量が減らない...
-
エクセルで別シートからの最大...
-
ExcelでTODAY関数を更新させな...
-
VBAで変数に関数式の結果をセッ...
-
労基法の週40時間を超える時...
-
エクセルで、加筆修正したセル...
-
エクセル ハイパーリンクで画像...
-
=HYPERLINK(VLOOKUPに関して。
-
エクセルで特定の文字を打つと...
-
Excelにて、カタカナだけのセル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelの「0」だけ非表示、小数...
-
日付が未入力の際はゼロか、空...
-
エクセルで1月0日と表示される!!
-
エクセルで条件に一致したセル...
-
(Excel)あるセルに文字を入力...
-
Excelで複数シートの選択セルを...
-
Rangeメソッドは失敗しました。...
-
シート参照で変数を使いたい(EX...
-
別シートのセルを絶対参照にする
-
エクセルで複写のように自動入...
-
Excelシートの保護時にデータの...
-
excelでハイパーリンクになって...
-
エクセルで別シートからの最大...
-
複数シートの同じセル内容を1シ...
-
エクセルで20万行あるシート...
-
ExcelでTODAY関数を更新させな...
-
EXCEL関数でシート名が変わる可...
-
エクセルで、加筆修正したセル...
-
Excelのファイル容量が減らない...
-
エクセル ハイパーリンクで画像...
おすすめ情報
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から始まる個別セルはもっと簡潔になりますか?
Range("$A$1:$P$292").PasteSpecial Paste:=xlPasteColumnWidths '列幅コピー
Range("$A$1:$P$292").PasteSpecial Paste:=xlPasteFormats '書式コピー
Application.CutCopyMode = False
--------------------------->Range("$A$1:$P$292")は表ですが配列にさせたい気持ちがあります。
.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
--------------------------->さらに余白設定を加えようと思うのですが、「設定」シートの一部になる表に印刷設定すれば省略できるところがあるのではないか(今のところ見つけられません)
最後にfor next 文の中に
・設定シートB列「祝日リスト」の個数を調べるwith 文
・何枚シートを作り繰り返すかループする for next 文(一ページを何行にするかを設定するfor next 文が入れ子としてあり)
・印刷設定をする with 文
・セル名にある曜日でセルに色を付ける if 文
が並列になって存在しております。 並列を少なくしたいです。合わせられたらうれしいです。
と、改善点がありましたらご教授ください。よろしくお願いいたします。
Sheets("設定").Range("N:AW").Copyはコピー前
Range("$A$1:$P$292")はコピー後
同一表のことです。
全体が長かったので、画像で申し訳ありませんが載せさせていただきます。
見えますでしょうか。やはりおっしゃる通り何がしたいかわからない感じですか?
画像はご覧になられたでしょうか。
つたないもので申し訳ありません。
遅くなりまして申し訳ございません。
あれから結局本日№3を拝見させていただくまでそのままで行っておりました。
「設定」という実際使う範囲をすでに作った元となる表を設けておりますが、希望する書式設定を施してロックをかけただけでは、1か月分を作り上げた時にはやはり幅なり余白なりが希望通りにならず、書式関係の処理は必須になってしまってます。