• ベストアンサー

エクセル2000で「切り取り」を不可としたい。

入力用のエクセルの表があり、入力された数値に基づき同じシート内で計算を行い、答えを出すようしています。 入力する部分は連続しており、5列20行ほどあります。 その部分のセルのロックを解除し、シートは保護して計算式の改変を防いでいるのですが、使用者の中には入力用のセルを切り取って、別の入力用セルに貼り付ける人がいて、そんなことをされると貼り付け先を参照した計算式はREFエラーになるし、切り取られた方を参照した計算式は参照先が変わってしまいます。 結果、こんなシートは使い物にならないと文句を言われます。 。・゜゜ '゜(*/o\*)'゜゜゜・。 ならばツールバーを非表示にして、おまけにCntrl+Xのショートカットキーも無効にしてやろうかいとも考えましたが、そうすると多くのユーザーの使い勝手を阻害することになってしまいます。 多分、一番いいのは「切り取り」を察知してUndoが出来ればと思うのですが、Changeイベントでは無理ですよね? 何か良い方法はないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.6

Tihs Workbookに、 Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) If Application.CutCopyMode = xlCut Then Application.CutCopyMode = False End If End Sub と、 Private Sub Workbook_WindowDeactivate(ByVal Wn As Window) If Application.CutCopyMode = xlCut Then Application.CutCopyMode = False End If End Sub で、よさそうだけど。

merlionXX
質問者

お礼

何度もありがとうございます。 同一シート内のみならず他BOOKへの「切り取り」&「貼り付け」の手当てをしていただき感謝いたします。 以下のようにしてうまくいきました。 Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) If Application.CutCopyMode = xlCut Then MsgBox "ごめん、「切り取り」されると困るんですぅ!", vbCritical, " (;≧o≦)ノ" Application.CutCopyMode = False End If End Sub Private Sub Workbook_SheetActivate(ByVal Sh As Object) If Application.CutCopyMode = xlCut Then MsgBox "ごめん、「切り取り」されると困るんですぅ!", vbCritical, " 他のSheetに? (;≧o≦)ノ" Application.CutCopyMode = False End If End Sub Private Sub Workbook_WindowDeactivate(ByVal Wn As Window) If Application.CutCopyMode = xlCut Then MsgBox "ごめん、「切り取り」されると困るんですぅ!", vbCritical, " 他のBOOKに? (;≧o≦)ノ" Application.CutCopyMode = False End If End Sub  (o。_。)oペコッ

その他の回答 (8)

  • NNAQ
  • ベストアンサー率56% (104/184)
回答No.9

セルをドラッグ&ドロップされたらだめなのでは? 数式を再セットするほうが良いと思いますけど。 一例で、 Sub sample(flg As Boolean) Static strFormula() As String Dim rng As Range Dim i As Integer With ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas, 23) i = 1 If flg Then ReDim strFormula(1 To .Count) For Each rng In .Cells strFormula(i) = rng.Formula i = i + 1 Next Else Application.EnableEvents = False For Each rng In .Cells If rng.Formula <> strFormula(i) Then rng.Formula = strFormula(i) i = i + 1 Next Application.EnableEvents = True End If End With End Sub ↓シートモジュールに Private Sub Worksheet_Activate() Call sample(True) End Sub Private Sub Worksheet_Change(ByVal Target As Range) Call sample(Target.HasFormula) End Sub 一応動きますが、不完全なのでジャンク扱い(動作保障無し)で。 考え方としては、 (1)作成済み数式を文字列で取得。 (2)その数式文字列をどこかに記録。 上記コードでは配列変数を使ってるが、未使用セルに書き出したほうがいい。 (3)数式が変更されてしまったら、記録した文字列から復元。 (1)(2)は、最初に1回実行、あとは数式を手直ししたときに実行するだけ。 (3)は、イベントまたは手動で。 やっぱりきついですか?

merlionXX
質問者

お礼

NNAQさま、貴重なご意見ありがとうございます。 ご回答に気づかず、お礼が遅くなりましたことを御詫び申し上げます。 たしかに、セルをドラッグ&ドロップされた同じことなんですが、これはオプションの設定でドラッグ&ドロップを禁じてしまえば対処は可能です。 ただ、ツールバーを隠したり、シュートカットを無効にしたり、そしてドラッグ&ドロップを禁じたら、そんなシートで誰も作業したくなくなりますよね。 やはりおしゃるように数式を再セットするほうが良いのかなと思い始めております。 他にも使用する方々からさまざまな意見がきていますので、もうすこし考えてみようと思います。 ご提示のコード、まだまだ浅学非才なわたくしめにはわからないことだらけですが、数式を再セット方式と決めたらまた質問させていただくと思います。 その節は宜しくお願いいたします。 今回はここで一旦締め切りたいと思います。 ありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.8

こんちには。 >Application.OnKey "^{x}", "" Application.OnKey "^x", "" >Ctrl + x が押されたときにメッセージを出すマクロを割り当てることですね? ということです。 >メニューバーから「切り取り」指示がされた場合の対応のことなのでしょうか? そのとおりです。メニューの編集の中の「切り取り」と右クリックメニューの「切り取り」のことです。クラスで、「コマンドボタン」に付け加えます。私は、既存のイベントにはつけません。

merlionXX
質問者

お礼

なんどもありがとうございます。 クラス・・・・ わたしにはまだまだついていけない分野のようです。 ありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

こんにちは。 >「切り取り」を封じたいのですが、切り取られたことを取得する方法がわからなかったのです。 あえてコードを書く必要はないと思いますが、私は、通常は、Ctrl + X のようなショートカットは、Auto_Openの中に、OnKey で、新たに設定させ、他のイベントは使いません。ブックを限定する場合は、DeActivate,Activate によってオン・オフをさせます。 ショートカットを封じるには、ダミーのプロシージャ・マクロを置きます。ここにメッセージを出してもよいと思います。また、コマンドは、コマンドボタン側にクラスのインスタンスを設けるようにします。

merlionXX
質問者

お礼

何度もありがとうございます。 Application.OnKey "^{x}", "" でCtrl + x を無効にする方法は存じているのですが、今回は操作性の点でまさかメニューバーまで消すわけにもいかないので困っていたのです。 > ショートカットを封じるには、ダミーのプロシージャ・マクロを置きます。ここにメッセージを出してもよいと思います。 Ctrl + x が押されたときにメッセージを出すマクロを割り当てることですね? > また、コマンドは、コマンドボタン側にクラスのインスタンスを設けるようにします。 この意味がわかりませんでした。メニューバーから「切り取り」指示がされた場合の対応のことなのでしょうか?

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.5

下記で、切取りを取得できませんか。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Application.CutCopyMode = xlCut Then MsgBox "cut" End If End Sub

merlionXX
質問者

お礼

そうなんですね! セレクションチェンジの時にCutCopyModeがxlCutになってればまさに「切り取り」しようとしてるんですよね。 okormazdさま、ありがとうございました!!

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 落雷で外国のマーライオンさんは壊れたそうですが、お元気ですか? >一番いいのは「切り取り」を察知してUndoが出来ればと思うのですが、Changeイベントでは無理ですよね? ということは、Change イベントはともかくとして、Ctrl + Xでは、Cut するだけで、Undo を発生させたら、その手前に戻ってしまいます。おそらく、貼り付け時に、Undo するということではないでしょうか。でも、それは、「切り取り」を封じているということと同じではありませんか?そのブックだけ、ショートカットの「切り取り」を封じてしまってもよいと思いますし、そのブックに限定させ、数式にのみに、「切り取り」を封じてしまっても、問題はないのではありませんか? しょせん、一部のワカランチンから文句言われるぐらいなら、メッセージを出して、こうなると事前に通告してもよいとは思います。

merlionXX
質問者

お礼

Wendy02さま、いつもありがとうございます。 はい、実家のMerlionは右耳を怪我したそうでが、わたしは至って元気です(笑) 「切り取り」を封じたいのですが、切り取られたことを取得する方法がわからなかったのです。 でもやっとわかりました。 Undoは必要なかったですね。 ありがとうございます。

  • Splatter
  • ベストアンサー率41% (181/440)
回答No.3

切り取り機能自体を封印すると操作性が悪化しますので、 逆の発想で、計算式のセルを再セットするマクロを作成しては いかがでしょうか。これで変更されても復元させる訳です。 まず、エクセルのシートに名前をつけます。 (デフォルトでSheet1等の名称となっている部分です) 次にマクロ機能を使い、簡単な実行プログラムを作成します。 マクロ機能といっても簡単なコードしか使用しなくて済むため、 未経験でもすぐに着手が可能かと思われます。 Excel VBA についての知識は以下のサイトがお勧めです。 ■Excel VBA 入門講座 http://excelvba.pc-users.net/ まず、マクロを記述するためのVisual Basic Editor を起動します。 起動方法については以下のページが参考になります。 ■Excel VBA 入門講座 | Visual Basic Editorの起動 http://excelvba.pc-users.net/fol1/1_1.html マクロに記述する機能はただ一つ。 『セルの指定とプロパティセット』というものです。 この機能については以下のページが参考になります。 ■Excel VBA 入門講座 | セルの指定とプロパティセット http://excelvba.pc-users.net/fol2/2_1.html 具体的に言うと、以下のようなコードを記述していきます。 ----------------------------------------------------- Worksheets("シート名").Activate Worksheets("シート名").Cells(1,21).Value="=SUM(A1:A20)" Worksheets("シート名").Cells(5,21).Value="=SUM(E1:E20)" …(以降同様) ----------------------------------------------------- 1行目の記述は指定したシートをアクティブにするものです。 2行目以降の記述は指定したシート『Worksheets("シート名")』 の、指定したセル『.Cells(X,Y)』を、Valueで指定した値 『.Value="セルの値"』に書き換えるといった物です。 2行目と同様の行を作成していき、指定するセルの番号と、 セットする値を書いていくことで全ての計算セルを埋めます。 このマクロを実行すると、プログラムで記述されたセルが一斉に 指定された値に置き換わるので、計算式を含むセルが変更されても 一括で指定した状態に戻すことができるようになります。 もちろん使用者が間違って切り取ってセル内容を消失していても、 マクロを実行すれば管理者も、利用者も簡単に復元できますね。 このマクロの実行は、エクセルシート内にボタンを作成して、 そのボタンを押すだけでマクロを実行するように登録もできます。 VBAマクロボタンについては以下のページを参照下さい。 ■印刷のテクニック EXCEL編 VBAマクロボタン http://homepage1.nifty.com/tabotabo/insat/excelp/excelp09.htm 以上の方法であれば、わざわざ切り取り操作を復元したり、 切り取り操作を察知してUndoするような高度なプログラムを 作成する必要はありませんし、エクセルシート側には特定セルに 編集ロックをかけておくだけで良くなります。 VBAに慣れてきたら、たとえば計算式以外のセルをボタン押下で すべて初期状態にリセットするボタンを作成してみたり、 勤怠票であれば日付を見て1日~31日の曜日を振ってみたり、 土日祝のセルに背景色をつける、といったマクロ機能を作成したりと 応用もできますし、興味があれば挑戦していただければと思います。

merlionXX
質問者

お礼

なるほど・・・。 たしかに計算式でREFエラーがでたら「復元」ボタンを押させるという手がありますね。 検討します。 ありがとうございます。 ただ、イベントで「切り取り」を取得できさえすればUndoのプログラムはさして難しいものではないんですが。むしろ数多の計算式を復元させる方が全部で30シートあるBOOKなのできついです。

  • uun373
  • ベストアンサー率48% (21/43)
回答No.2

入力するセルの座標が固定であれば、こんな方法もあります。 例 : A1~C3に入力するとして、A7~C10でそれを呼び出すとします。 まず、A4~C6に、それぞれA1~C3の参照名をデータとして入れた 文字列を入れておき、隠しておきます。 A7~C10で、INDIRECT(A4)~INDIRECT(C6)という風にして呼び出すと A1~C3の所で切り取り貼り付けを行われてもA7~C10で得られる参照結果は変わりません。 切り取りされても問題がないようにする、という別のアプローチ方法ですが、 参考になれば幸いです。

merlionXX
質問者

お礼

そうか、直接セル番地を指定しないという方法もありですね。 前面作り直しになるのがちときついですが・・・。 (全部で30シートあるんです!)

  • web2525
  • ベストアンサー率42% (1219/2850)
回答No.1

シートを保護し、入力用のシート(または入力フォーム)を別に作成。 入力完了後にマクロで指定した保存シートに追加していく形式に変更しては? 入力後の結果表示が必要なら、計算結果を表示するマクロをつけ足せばよいかと。

merlionXX
質問者

お礼

ありがとうございます。 たしかにすべての入力が終わってから計算させるだけでよければそういう方法も取れますね。 ただ、今回は入力している途中にも途中までの計算結果を確認させるのでこれは使えそうもありません。 すみません。 でも今後の参考にします。 ありがとうございました。

関連するQ&A

  • excel 参照しているセルに色がついていたら、返すセルにも色もつける

    excelの詳しい方、ぜひ教えてください! Sheet1にあるデータを、計算式によってSheet2に参照させていますが、Sheet1のセルの色までは参照する事ができません。 計算式はいたって簡単で、例えばSheet1のA1を参照している時は、Sheet2のセルに =Sheet1!$A$1 と計算式を入力しています。 条件付き書式や関数も考えたのですが、 ”もし、参照しているセルに色がついていたら、返すセルにも色もつける” をどうすれば出来るのかわかりません。 どうか、わかる方ぜひ教えてください。お願いします!!

  • エクセル 列の削除・挿入と関数、計算式の範囲について

      A  B  C  D  E 1  2 2 3 4 2 2 1 1 2 3 5 3 2 5 6 7 2 4 2 2 3 4 4 5 2 1 5 8 6 6 9 11 19 26 19 ←各列合計 sheet1に上記のような表があったとします。 6行目以外は誰でも入力可能です。しかし6行目の各列合計の行は計算式が入っているため、改変できないようにセルを保護します。 本来ならそれで解決なんですが… 列の削除や挿入をしなければならないんです。 セルの保護をしている箇所があると、当然削除は出来ません。 これはどうしようもないものでしょうか? もし上記が無理なら、sheet2に合計のみの表を作って計算式を入れたいのですが、今度は削除や挿入をするため、参照先がおかしくなりエラーが出ます。 何か良い解決方法があれば教えてください。

  • エクセルでシート間の相対参照

    シートを分けて表を作成しています。 Sheet3のセルA1に「='sheet1'!A1」という計算式を入力しています。 この計算式を[B1]にコピーすると「='sheet1'!B1」ではなく、「='sheet2'!B1」という計算式にすることは可能でしょうか? 参照するセルも、シートも変更してほしいのですが、うまくいきません。 どなたかよろしくお願いします。

  • エクセルの足し算の関数について

    エクセルの足し算の設定について質問です。 とてもシンプルな計算式で、あるセルに、仮に =A + B + C という 足し算を設定しようとしています。 Aは、計算結果を入れようとしているセルと同じシートにある別のセルとイコールで結びます。 BとCは、他のシートにあるセルを参照しようとしています。 参照先のセルは、複数のセルを結合したもので、 =B1 + B3 + B5 + B7・・・・といったような少し長めの足し算が入っています。 これで計算結果を反映しようとすると、#VALUE! エラーとなってしまいます。参照先のシートの構成などはできれば変えたくありません。 どのように直せばいいのでしょうか? 詳しい方ご教示お願いいたします。

  • excelの参照について

    excelの参照について 初心者です。 1枚目のシートの情報を2枚目以降のシートに参照させたいのですが それぞれのシートの同じセルに シート2枚目には A1のセルを参照させ シート3枚目には A2のセル シート4枚目には A3のセル・・・ という具合にシートが進む毎に一つずつ下段のセルを参照させたいのですが シート1枚ごとに手で一つずつ入力するのではなく なにか一括して入力する方法はありますでしょうか? よろしくお願い致します。

  • Excelで参照するシート名を計算で求めることは可能ですか?

    前置き 本当は邪道だと思うのですが・・・・。 Excelでとある見積書を部品ごとにシートを分けて作成しており、 そのシートは80シートにも及びます。 この見積書の合計部分のみを集めた、統括表の様なシートを別途作成 してその表に80シートの合計部分のみを自動参照(リンク)させて計算 したいのですが、計算式をコピーしてもセル参照は変わってもシート名だけは 変わってくれず、ひとつひとつシート名を手修正している次第です。 ファイルはたくさんあるのでこのままでは、日が暮れてしまいそうで 困り果てております。 シート名の部分をこのセルの値を参照するというように計算で求めることは 可能でしょうか?教えてください。

  • エクセルで表を移動する際に、参照するセルを固定する方法は?

    エクセル用語にくわしくないので、わかりにくかったらごめんなさい。 エクセルで表を作ったのですが、レイアウトの都合で、ある一部分を別の場所に移動させようと思いました。ところが、「切り取り」→「貼り付け」を選択すると、計算式で参照しているセルも変わってしまいます。 これを解消するには、セルの記号の上に「$」をつけていけばいいのは知っていますが、移動させる部分が大きいため、いちいち「$」をつけていくのは作業効率が悪いです。 たとえば、「何かのボタンを押しながら、『切り取り』を選択する」というような方法で、参照セルを固定することはできないのでしょうか? 教えて下さい。 なお、現在使用しているのは Excel 2000 です。

  • EXCELの入力規則に関して

    EXCEL 2003 で簡単な品物の管理表を作成しています。 例えば、品目としてパソコンがあり、品番としてAとBが有ったとします。 "パソコン"はセルにそのまま表示させ、品番は入力規則でAとBと書かれたセルを参照させ、ドロップダウンリストで選択するような作り方をしています。 このような場合での質問です。 1)入力規則で別シートのセルを参照先とすることはできますか。 2)参照先を作成せずに、ドロップダウンリストを作ることはできますか。(値一覧をセルやデータに内包するような感じです) 3)入力規則を複数のシートにコピーし、片方の値を変更した場合、別シートの同じ入力規則の値も連動して変更させることは出来ますか。 入力規則の機能では作りきれない部分も有るかとは思いますが、なにか良いアイデアがあればご提案いただくと有り難いです。

  • エクセル/シート保護でドラッグ&ドロップを不可としたいのです。

    エクセル2000です。 データを入力させるためのいくつかのセルを色を変え、ロックをはずしてシートを保護をかけたのですが、ロックされていないセル同士では、ドラッグ&ドロップでセルが上書きされます。 ロックしていないセル同士なのでデータが上書きされることだけでは別に問題はないのですが、ドラッグ&ドロップだとドラッグされた元のセルの書式(色)が無くなってしまいます。 そして何よりも一番困るのは、上書きされたセルを参照している計算式が、#REF!エラーになってしまうことと、ドラッグされた元のセルを参照している数式のセル番地が変わってしまうことです。 入力は可能でドラッグ&ドロップを不可とする方法はないでしょうか? なお、入力データが同一な数値の連続ということもあるのでオートフィルはできた方がありがたいのですが、ドラッグ&ドロップを不可とする都合上できなるなるならやむをえません。 なにとぞ良い解決方法をご教示ください。

  • エクセルの再計算の順番について

    いつもお世話になっております。 たとえば、シート1~5までのファイルがあり、 各シート内に関数が多数入力されております。 その中にはシート内で完結する関数もありますが、 シート1には、 シート3の計算結果を参照した シート5の計算結果を参照するセル(複数)があり、 その結果を合計する式が入っております。 【シート3】で計算  ↓(計算結果を参照) 【シート5】で計算  ↓(計算結果を参照) 【シート1】で計算 このようなファイルにおいて [F9]keyで再計算を実行した場合、 どのような順番で計算されるのでしょうか? 【シート1】のA1から順番にか、 【シート3】の大元の計算からか はたまた・・・ よろしくお願いいたします。

専門家に質問してみよう