- ベストアンサー
エクセル セル内 文字数が多いと遅い
ウィンドウズxp で オフィス2000を使っています。エクセルでひとつのセルの中に、沢山の文字を入力しているのですが、文字数が増えると同時にとても遅くなります。文字入力自体も遅いですし、変換も遅いです。まるで、腹話術の時差のようです。 多いといってもそこまでではありません。せいぜい500文字から1000文字程度です。同じセルの中で何度も改行はしますが。 こうも遅いと仕事をする上でパフォーマンスが悪くて困っています。 ひとつのセルで沢山の文字を入力し、そして改行も行うとして、この以上に遅くなる現象を解決できる方法ってあるのでしょうか? 以上よろしくお願いいたします。
- みんなの回答 (22)
- 専門家の回答
質問者が選んだベストアンサー
テキストボックス等はユーザーフォーム上に作成してください。 保存はエクセルファイルを保存することになりますが、さしあたり保存しなくても動作すると思います。 エラーが出たときにデバッグ画面が表示されると思うのですが、黄色くなっていたり反転表示されている部分を教えていただけませんか? コード中の入力フォーム、OK、Cancel、TextBoxなどは、オブジェクト名(プロパティウィンドウの一番上)と一致していないと動作しません。 あと、フォームのコードを一部変更しました。 Option Explicit Private Sub UserForm_Initialize() TextBox.Value = ActiveCell.Value End Sub Private Sub OK_Click() ActiveCell.Value = TextBox.Value Unload Me End Sub Private Sub Cancel_Click() Unload Me End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) ActiveCell.Offset(1).Select End Sub
その他の回答 (21)
- shinkami
- ベストアンサー率43% (179/411)
>日々の運用上、別のブックにコピーペーストを行うという >運用の仕方は現実的には無理ですので、せっかく提案いただきましたがちょっと難しいですね。 説明不足でした。 更新の都度コピー&ペーストするのではなく、1度やるとしばらくはやらなくてよいと思います。 何回も更新を繰り返すと、ファイル容量が必要以上に大きくなるようです。 自分のPCはWindowsXp Excel2000ですが、 120回くらい更新をしたファイルがありましたので、これを新しいファイルにコピーしてみました。その結果 196KBが164KBに減少しました。 注、他のワークシートを参照している場合、元のファイルのワークシートを参照するんで、参照式を変更する必要があります。
- cafe_au_lait
- ベストアンサー率51% (143/276)
>なんとかクリックすると入力フォームが出てくるようになりました。しかし全てのセルに同じ現象が起きてしまいました。 ANo.16にて、以下のコードはダブルクリックした行が15行目か16行目の場合にフォームを表示するというものです。全てのセルで表示されるということですので、この行がうまく機能していないようです。 If Target.Column = 15 Or Target.Column = 16 Then 入力フォーム.Show End If >またこの入力フォームでは、セルの中の指定した範囲の文字のフォントの色を変えたり、太字にしたりできません。 書式を変更するとなると、ちょっと厳しいですね・・・。方法はあると思うのですが、お伝えする自信がありません。 質問です。 2列用意しているとのことでしたが、2列目が腹話術現象を起こすほど大量に入力されることはありますか?また、もし2列目が一杯になる場合はどう対処しますか? もし2列目が腹話術現象を起こさない程度であれば、1列目が一杯になるまではAN0.12のような方法で追記し、2列目は普通に入力するといった手段が考えられるのですが・・・。
- shinkami
- ベストアンサー率43% (179/411)
腹話術の時差現象は資源の無駄使いが原因だと思いますので色々試していただいたのですがどれも効果がなく、貴重な時間無駄にされたようで申し訳ありません。 ご迷惑ついでに次のような2つの提案をさせていただきます。 1・BOOKを新規作成して、ここへ有効なセルだけをコピー&ペーストして、保存。これで新旧のファイルサイズに大きな差異(2倍以上)があれば解決です 複数のワークシートのときはワークシート名を旧のものと同じにしてから、 参照されるシートからコピー&ペーストです 2・別のサイトですが、参考URLに詳しくありました。 何がどう効くのかわかりませんがANo.4(20pt獲得)も参考になりますか
補足
ありがとうございます。 日々の運用上、別のブックにコピーペーストを行うという 運用の仕方は現実的には無理ですので、せっかく提案いただきましたがちょっと難しいですね。
- shinkami
- ベストアンサー率43% (179/411)
30列もあり、マクロまで組み込んでいる事情があるのでしょう 仕組みの変更は大変ですね、今回はこのまま行くとして オートフィルターは大変便利なものです。次の方法で体験してみて下さい。 今後の仕組みづくりに使いたくなりますよ データが50行まで入力されているとして 1.BOOKにSheetを追加して、sheet1のセルA1~C51までをSheet2に3回貼り付けてます これで153行の表ができますね、途中に入った見出し行を削除して、151行の表にします 2.セルD1にアポ状況と入力、セルD2にアポ情報1と入力 3.セルD2をクリックして、D2の右下にマウスカーソルを移動するとマウス記号が白十字から単なる+に変わります。この状態でマウスの左を押下、下のセルへドラッグするとアポ情報2、アポ情報3…と変化していきます。アポ情報150まで来て準備完了です。 4.セルB5くらいをクリックして、ツールバーのデータからフィルタに入ってオートフィルタをクリックします。 これでオートフィルタの設定完成です。 A列の▼をクリックして下さい。 いかがですか
補足
ありがとう御座います。 このオートフィルタは私の抱えている 解決すべき一つのセルに沢山の文字を記入する際の パフォーマンス低下の改善案という事ですか? 私もオートフィルターという名称についてはあいまいでしたが もともとこのテレアポシートにはオートフィルタが 設定してあります。すみません言うのが遅くて それは、4行目に 企業名、住所 郵便番号 担当者名 電話番号 顧客アプローチステータス 顧客カテゴリー 等々で オートフィルターでソートできるようになっています。 以上よろしくお願いします。
- shinkami
- ベストアンサー率43% (179/411)
メモリ管理ソフトは試してもらいましたか ディスクのクリーンアップはご存知ですね、RAMメモリーにも必要です。 どうしてこの機能がWindowsXpに入っていないのか不思議です。 「メモリーの掃除屋さん」のURLを参照URLに入れておきます。 ここをクリックして、インストールしてください。 数回のクリックでのフォルダーがデスクトップ上に作成されますので、この中の「MemClCmd.exe」を実行してください。 きっと腹話術時差は解消すると思います。
補足
ありがとうございます。 こちらはこちらで試してみます。 ちなみに、エクセルの腹話術時差現象は改善されませんでした。残念。
- cafe_au_lait
- ベストアンサー率51% (143/276)
まず、シートのタブを右クリック→コードの表示をクリックします。 以下のコードを記述します。 Option Explicit Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Column = 15 Or Target.Column = 16 Then 入力フォーム.Show End If End Sub 次に、メニューバーから挿入→ユーザーフォームを選択します。 メニューバーの表示から、ツールボックスとプロパティウィンドウを表示させます(すでに表示されている場合は無視してください)。 ツールボックスから、テキストボックスひとつとコマンドボタン二つを作成します(場所、サイズは任意)。 UserForm1、TextBox1、CommandButton1、CommandButton2の4つが作成されたので、プロパティウィンドウにてオブジェクト名とCaptionをそれぞれ変更します(ここでは順に入力フォーム、TextBox、OK、Cancelとしておきます)。また、TextBoxのMultilineをTrueに、ScrollBarsを3にしておきます。 メニューバーから表示→コードを選択して、以下のコードを記述します。 Option Explicit Private Text0 As String Private Sub Cancel_Click() Unload Me End Sub Private Sub OK_Click() ActiveCell.Value = TextBox.Value Unload Me End Sub Private Sub UserForm_Initialize() Text0 = ActiveCell.Value TextBox.Value = Text0 End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) ActiveCell.Offset(1).Select End Sub たぶんちゃんと動くと思うのですが・・・。分からない、動かないとかありましたら補足願います。ユーザーフォームについては検索すればいろいろヒットすると思います。
お礼
すみません。言われたとおりにやったところ、コンパイルエラー 変数が定義されていませんとでてしまうようになってしまいました。どうしたらいいでしょう?
補足
有難う御座います。 上記の操作やってみましたが今までやった事のない操作なので これで有っているのかすらよくわかりません。 ツールボックスから、テキストボックスひとつとコマンドボタン二つを作成します(場所、サイズは任意)と有りますがこれを作成する場所はユーザーフォーム上に作成するのでしょうか? そして全てのコード等の記述が終わった段階で、最後はどのように終了するのでしょうか?ファイル→シートの上書き保存でしょうか? 一応そのようにしてみましたがエクセル上に何も変化はないようでした。 なにがどう間違っているのでしょうか
- shinkami
- ベストアンサー率43% (179/411)
オートフィルタは例えば特定の顧客名のみの行を抽出して表示してくれます。この機能によりアポシートにはアポの都度行を追加できます。 オートフィルターのかけ方は、参照URLの入門初級編の初級11を見てください アポシートは顧客シートの左端に日付とアポ内容を追加したものです。 参照式は顧客名をキーにして顧客情報を表示するためです。 D2=IF($C2="","",VLOOKUP($C2,顧客シート!$A$2:$D$51,2,1)) E2=IF($C2="","",VLOOKUP($C2,顧客シート!$A$2:$D$51,3,1)) F2=IF($C2="","",VLOOKUP($C2,顧客シート!$A$2:$D$51,4,1)) 上記式をご覧下さい一箇所だけ変化しています 列番号です。 この参照式を有効にするためには、顧客名が昇順に並んでいなければなりません。 分類アイコンはツールバー上にありますね、顧客名の一つをクリックしてから昇順をクリック 日付は Ctrl+; で今日の日付が入力できます 顧客名は入力セルで右クリックからリストから選択で少しは楽? さて本来の目的ですが、ディスクのクリーンアップはご存知ですね、RAMにもこれが必要です。 「メモリーの掃除屋さん」がしてくれます http://www.vector.co.jp/soft/win95/hardware/se190988.html 自動解凍ですのでクリックで答えていくだけでデスクトップにセットしてくれます。メモリーの掃除屋さんのフォルダー内のMemClCmd.exe実行してこのままデータ入力を続けてください。 尚オートフィルタ機能は空白行,空白列があった時はその場所でコントロールは切れます。
補足
ごめんなさい ちょっと私にはむずかしすぎます。 ただし、上記のオートフィルタに関して言うと、 ひとつの顧客に対して複数の行を用意するための物ですよね? 私としては、あくまで1顧客につき一行で完結させることを前提としています。 ですので、追加の記述は同一セルの中に改行して追記して行く形となります。これは譲れない部分です。 そしてそのセルがブラウザの画面いっぱいになったら右となりの列のセルに続きの内容を記入していくと形です。 そのやり方で、パフォーマンスが腹話術時差のようにならない方法を 探しています。
- shinkami
- ベストアンサー率43% (179/411)
目的が分かりました。 これならExcelのデータ処理機能を利用すると 任意顧客の抽出 分類、日付別抽出分類が可能となりますし 詳細は次の通りです テレアポ進捗管理 ワークシートを顧客情報を登録しておく顧客シートと 日常のアポを登録するアポシートの2つ用意します。 何れのシートも1行目は項目名とし、2行目以降がデータ行 ・顧客シート A1:企業名 B1:住所 C1:電話番号 D1:担当者名 仮に顧客数が50とすると、2行目から51行目までがデータ行になります。 ・アポシート :顧客シートの項目に日付とアポ内容の2項目を加えて A1:日付 B1:アポ内容 C1:企業名 D1住所 E1:電話番号 F1:担当者名 セルA1~C1は入力項目ですが、セルD1~F1顧客シートを参照します。 セルD2~F2の参照式は次の通りです。 D2=IF($C2="","",VLOOKUP($C2,顧客シート!$A$2:$D$51,2,1)) E2=IF($C2="","",VLOOKUP($C2,顧客シート!$A$2:$D$51,3,1)) F2=IF($C2="","",VLOOKUP($C2,顧客シート!$A$2:$D$51,4,1)) これらの参照式をD3から適当な行(例えばD1500)までコピー アポシートに数件情報が入った時点でオートフィルタをかけます。 顧客シートは追加登録の都度 顧客名の昇順に分類してください 追記:データ機能は空白行または空白列が入ると機能しません(空白セルは可)
補足
アポシートに数件情報が入った時点でオートフィルタをかけます。 ・・・オートフィルタって何ですか?アポシートに情報が入った段階でその処理をすることで顧客シートとどうなるんですか? 顧客シートは追加登録の都度 顧客名の昇順に分類してください ・・・顧客シートには、顧客が増える都度A~Dまで手入力するとしてアポシートにも手入力しなければなりませんよね?A,B,Cは。理由はD~Fと違って顧客シートを参照していませんし。 ちなみに本来の目的はアポ内容をセルに記入するときにパフォーマンス低下することの改善方法を探しているのですが、上記のD~Fの顧客シートを参照し、アポシートには従来どおり、ひとつのセルに沢山の文字を入力していくという事に変わりわないと思いますがパフォーマンスが改善されるという事でしょうか?
- cafe_au_lait
- ベストアンサー率51% (143/276)
では、セルをダブルクリックしたときにフォームを表示させて、その中のテキストボックスで編集するというのはいかがでしょう? 改行がctrl+Enterになってしまいますが・・・。
補足
セルをダブルクリックしたときにフォームを表示させて、その中のテキストボックスで編集するというのはいかがでしょう?・・・・それは良いですね。どうやってそれを実現するんですか?方法を教えていただけると試してみます。よろしくお願いします
- cafe_au_lait
- ベストアンサー率51% (143/276)
No.8&9です。補足拝見いたしました。 6列目以降の説明がありませんが、もし空白だとすると、自分なら日付ごとに列を分けて記入するような気がします(読みやすさを考えると行列を入れ替えるかも)。きっと6列目以降も項目が続いているのだと推測します。 もし6列目に(末尾の列でもよいですが)追記用の列を挿入することができるのでしたら、以下の方法でいかがでしょうか? ・シートのタブを右クリックしてコードの表示をクリック ・以下のコードを入力 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False With Target If .Column = 6 Then .Offset(, -1).Value = .Offset(, -1).Value & Chr(10) & .Value .Clear End If End With Application.EnableEvents = True End Sub 6列目の内容を変更したとき、隣のセルにセル内改行ととともに追記し、入力セルの内容を消去します。
補足
有難う御座います。 おっしゃるとおり5列目というのは判りやすく伝えたものです。 実際に履歴を記入していく列は15列目くらいで16列目以降も 使用しており全部で使っている列は30列くらいあります。 ですので、次の列を利用したり、末尾の列を利用したりというのは 現実的に運用上厳しいですね。 現在、ひとつの列のひとつのセルに(セルの高さがブラウザの画面の 上下幅いっぱいになったときのために、履歴記入用の列を2行にしています。15列目と16列目です。15列目のセルがいっぱいになったら16列目に移って記入しています。
補足
ありがとう御座います。 なんとかクリックすると入力フォームが出てくるようになりました。しかし全てのセルに同じ現象が起きてしまいました。 必要とするのは顧客とのやり取りをする2~3列のみです。 他のセルには、この入力フォームが出てきてしまうと、運用しずらくて 使えません。 指定した列だけを使えるようにしたいです またこの入力フォームでは、セルの中の指定した範囲の文字のフォントの色を変えたり、太字にしたりできません。 これも業務上必要ですで出来るように出来ますか?