- ベストアンサー
関数の使いすぎでエクセルが重いです・・・
ヤフオクの管理をエクセルでやっていて、今度発送連絡文もエクセルで作ってしまおうと思っています。 添付のような管理ファイルです。 H列の発送連絡に以下のような関数を記入しました。 ------------ =A1&"さん 発送しました。 伝票番号は"&G1&"です" ------------ ※実際にはもっと長いです。 これをコピーして取引ナビ(連絡用掲示板)に貼り付ける予定です。 これが、1シートに500行以上あり、さらに12シート(12ヶ月分)あります。 とりあえず作ってみたのですが・・・重すぎてエクセルが開けなくなりました。 マクロはある程度使えます。 なんとか、重くならずに上記を実現する方法はありませんでしょうか。 ご教授お願いいたします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
No2 merlionXXです。 「取引ナビ」ってなんだかわからないので、とりあえずYahooのサイトを開く例です。URLを書き換えればお好きなとこを開くと思います。 Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Dim r As Long '変数宣言 Dim IE As Object '変数宣言 If Target.Column <> 8 Then Exit Sub 'ターゲットが8列目(H列)以外なら終了 r = Target.Row 'ターゲットの行番号を取得し変数rに代入 Target = Range("A" & r) & "さん" _ + Chr(&HD) + Chr(&HA) + "発送しました。" _ + Chr(&HD) + Chr(&HA) + "" _ + Chr(&HD) + Chr(&HA) + "伝票番号は" & Range("G" & r) & "です。" 'ターゲットに入力 Cancel = True 'ダブルクリック状態をキャンセル Target.Copy 'ターゲットをコピー Set IE = CreateObject("InternetExplorer.Application") 'IEのオブジェクト作成 IE.Visible = True '見えるようにする IE.Navigate "http://www.yahoo.co.jp/" '指定したURLを開く End Sub
その他の回答 (5)
- hallo-2007
- ベストアンサー率41% (888/2115)
これは、今回の関数を入れてから重くなったのでしょうか。 重すぎて開かないというのは、再計算の時間がかかっているということでしょうか。 何か他に原因が有りそうな気がしますが、取合えず。 >※実際にはもっと長いです。 >これをコピーして取引ナビ(連絡用掲示板)に貼り付ける予定です。 目的であれば、ワードの差込印刷の機能で定型文書の中に名前などを 入れ込んではどうでしょうか。 或いは、別シートに文書入れて、必要箇所に名前などを引っ張ってくる式 或いはVBAを実行させる方法が便利でもあるように思います。
- web2525
- ベストアンサー率42% (1219/2850)
計算式はH列だけですか? 実際にはセル参照だけで計算もしていないし、配列でもないし 1シート1000行としても12シートで12000行しかないわけですよね、それだけでエクセルが開けなくなるほど重くなることはないと思うのですが。 重くなるのには他に原因がありそうですが。 発送連絡のH列はすべて文面が一緒で落札者と伝票番号の参照だけなら、すべての行に作る必要が有るのでしょうか? 別シートで連絡文のひな型作成を行い、連絡送信するセル(行)を選択しマクロで必要項目を差し込み送信結果として確認セルにチェックするような形式にすると処理も軽くなるかと思います。
- rukuku
- ベストアンサー率42% (401/933)
はじめまして 関数ですと、セルの値が変更される度に「すべてを」再計算しますので、数が多いとどうしても遅くなります。 その点、マクロならば実行のタイミングや計算の範囲を指定できますので、軽くできると思います。 もう少し具体的な仕様が分かればある程度マクロが組めますが、 おそらく使っているうちに改良を加えたくなると思うので、 マクロの作り方をアドバイスします。 まず、ご質問にある関数をマクロで書くと以下のようになります。 Sub test() [H1] = [A1] & "さん" & Chr(10) & "発送しました。" & Chr(10) & "伝票番号は" & [G1] & "です" End Sub ただしこれでは、1行しか処理できません。 「For...Next ステートメント」を使うと繰り返しの処理ができます。 Sub test2() Dim i For i = 1 To 10 Cells(i, "H") = Cells(i, "A") & "さん" & Chr(10) & "発送しました。" & Chr(10) & "伝票番号は" & Cells(i, "G") & "です" Next i End Sub これですと1~10行目まで処理できます。(Forの中で1~10と指定しているからです) 後は ・どのタイミングで実行するか (マクロですので、セルの値を変更しただけではH列に反映されません) ・どの範囲を (「全部のシートのデーターの入っているところ」という設定もできますが、それでは処理に時間がかかってしまいます。 500件くらいのデータなら「今開いているシート」でもちょっと待つ位で完了します) という設定が必要になります。
- merlionXX
- ベストアンサー率48% (1930/4007)
各シートのデータ配置が同じなら、マクロでやってみましょう。 標準モジュールやシートモジュールではなく Thisworkbookモジュールに以下をコピペ Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) If Target.Column <> 8 Then Exit Sub r = Target.Row Target = Range("A" & r) & "さん" _ + Chr(&HD) + Chr(&HA) + "発送しました。" _ + Chr(&HD) + Chr(&HA) + "" _ + Chr(&HD) + Chr(&HA) + "伝票番号は" & Range("G" & r) & "です。" Cancel = True End Sub これで、すべてのシートのH列上でダブルクリックすると、その部分(ダブルクリックしたセル)にA列とG列のデータを入れたご指定の文言が自動入力されるはずです。
補足
ご回答ありがとうございます!! どうしようと本当に迷っているのですが、光が見えてきました☆ 教えて頂いたソースが正直私には難しいので現在勉強中です。 文字のつなげ方が関数の時とは違うようで・・・ あと、IF文がどのような処理なのかわかりません(><) これを元に、以下のようにしようと考えています。 (1)ダブルクリックしたら発送文をクリップボードにコピー (2)コピーした後、取引ナビのページを開く これをマクロ化すれば、あとは貼り付けだけなので、楽で軽いエクセルになりそうです♪ もし、お時間に余裕があればもう少し補足して頂けるとありがたいです。。。
- xls88
- ベストアンサー率56% (669/1189)
マクロにすれば関数を埋め込むよりも軽くなるのは間違いないと思います。 マクロを個人用マクロブックに置けば、該当ブックの負担は0ということになります。 該当ブックにマクロを保存した場合でも、関数を埋め込むよりは有利だと思います。
お礼
ありがとうございます! まさに求めていたものです!! これをベースに頑張ってみます☆