Excel操作でクリップボードからの貼り付け

解決


REIKO  2007-07-10 00:41:55  No: 26979

TExcelApplication,TExcelWorkBook,TExcelWorkSheetを
利用してExcelを操作しています。

   ExcelWorkSheet1.Range['A1', 'A1'].Value := 'AAA';

というように代入すると「元に戻す」が利用できなくなります。
「元に戻す」の機能を利用したいので、値を
クリップボードに一旦、覚えておいて
CTRL+Vを送信し、貼り付けをしようとしています。
下記のソースで一度だけの貼り付けなら何とか
できましたが、連続で実行すると動作がおかしくなります。
クリップボードの内容がクリアされてないためと思われますが、
最終行にクリアを入れるとうまく動作しません。

   // クリップボードをクリア
   ClipBoard.Clear;
   // 値をクリップボードにコピー
   ClipBoard.AsText := 'AAA';
   // 指定されたセルを選択
   ExcelWorkSheet1.Range['A1', 'A1'].Select;

   // キーボードコマンドでCTRL+V(貼り付け)を送信
   keybd_event(VK_CONTROL,0,0,0);
   keybd_event(Ord('V'),0,0,0);
   keybd_event(Ord('V'),0,KEYEVENTF_KEYUP,0);
   keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);

   // クリップボードをクリア
   ClipBoard.Clear;                //  これを入れるとうまくいかない

やはり、「元に戻す」は自作しないといけないのでしょうか?

環境は、Delphi5+WindowsXPです。
何か良い方法があれば、よろしくお願いします。


Mr.XRAY  URL  2007-07-10 05:55:43  No: 26980

>最終行にクリアを入れるとうまく動作しません。

この「うまく動作しません」がどうのような状態を言っているのかはわかりませんが,
(電源スイッチを入れたけど,パソコンがうまく動作しないとかね... ^_^; )
keybd_eventはフォーカスのあるウィンドウに対して有効ですから,Excelに対して
実行するのであれば,

var  ARange : Range;

   // 値をクリップボードにコピー
   ClipBoard.AsText := 'AAA';

   // 指定されたセルに貼付け
   ARange:=WorkSheet.Range['D1','D1'];
   ExcelWorkSheet1.Paste(ARange);
   
のような感じで可能です.もちろん値をクリップボードにコピーする
Copyメソッドもあります.
(動作確認  WindowsXP-SP2 + Delphi5 + Excel2000 )

>やはり、「元に戻す」は自作しないといけないのでしょうか?

VBAやDelphiなど,外部の言語でExcelを操作する際は,[元に戻す]機能は
使用できません.自分で操作を記録したりする必要があります.
この仕様は,Excel本体自自身(ユーザ)による操作と外部からの操作をどのように
使い分けるかを考えさせてくれるのではないでしょうか.


REIKO  2007-07-10 18:27:09  No: 26981

Mr.XRAYさん、ありがとうございます。

うまく動作しないと言うのは、
連続実行した場合、最後のデータしか
セルに貼り付きません。

一回だけだと、貼り付けもできません。
CTRL+Vが動作する前にクリップボードの内容が消えてるのでしょうか?

>ExcelWorkSheet1.Paste(ARange);

この場合、やはり、「元に戻す」が消えてしまいます。

やはり、自作しかないようですね。


HOta  2007-07-10 20:43:30  No: 26982

ソースを見ないと判りませんが、
ExcelWorkSheet1.Paste(ARange);
だと、予め、ClipBoardには、全ての貼り付けるデーターを用意してから
貼り付けます。
ClipBoard.AsText := 'AAA'+#9+'BBB'+ #10#13+'CCC'+#9+'DDD';
の様にして、
ExcelWorkSheet1.Paste(ARange);
するとどうでしょうか?
連続実行すると、同じ場所へ貼り付けているのでしょう。


Mr.XRAY  URL  2007-07-10 23:44:32  No: 26983

>ExcelWorkSheet1.Paste(ARange);

>この場合、やはり、「元に戻す」が消えてしまいます。

既に述べたように,VBAやDelphiのコードで実行した場合は使用できません.

>やはり、自作しかないようですね

その通りです.Excel本体のメニューなどで操作した時,Excelそのものが操作を
記録しているわけです.ですから[元に戻す]機能が使用できます.
Excelがそのようにできてます.
残念ながら,DelphiにはExce操作を記録しておく機能がありませんし,また
[元に戻す]機能を利用するメソッドもありません.
Delphi(VBAでも)で操作する場合は,自分でそのコードを書くことになります.
つまり,[Excelがそのようできています]の部分をプログラムで作成します.
これはどんなアプリケーションを開発する時もそういうことになります.
(Excelはアプリケーションの一つです.誰かが開発したものです)

たとえば,画像編集のアプリを開発するとします.
その際,[戻す]機能は開発者がコーディングしないとその機能は実現しません.


Mr.XRAY  URL  2007-07-11 00:21:16  No: 26984

>(Excelはアプリケーションの一つです.誰かが開発したものです)

余談ですが,これは現在パソコンのエンドユーザにはほとんど通用しないでしょうね.
かって,OSさえインストールしなければならなかった時代には,
「パソコン,ソフトがなければタダの箱」
と言ったものです.

今のエンドユーザはエクセルやワードはパソコンの一部だと思っている感があります.
「一太郎=パソコン」という時代もありました.
まったくスレッドに関係ない話しでゴメンなさい.


REIKO  2007-07-11 01:17:35  No: 26985

HOtaさん、Mr.XRAYさん、ありがとうございます。

Excelを制御するプログラムを要求されていますが
アンドゥははずせないと言うことで、できるだけ
簡単にと思ったのですが、そうもいかないようですね。

自作の方向で考えたいと思います。

ExcelのOnSheetChangeイベントだと行挿入に反応しないなど
いろいろと問題があるようなので
どのタイミングで操作を記録するかが難しそうですねぇ。

この件については、これで解決にさせて頂きます。
いろいろと、ありがとうございました。


Mr.XRAY  URL  2007-07-11 07:32:43  No: 26986

アプリの開発はクライアントとの闘いかも知れませんが、
エクセルで操作を自動化して便利にすると、エクセル本来の機能([元に戻す]とか)は
使用できなくなるとか、ある程度の「ウソ」も必要かと。
その際、「できないなんて、この開発者はあまり実力はないな」と思われてもジッと
耐えるのもクライアントに勝つコツかも知れません。

それを、なんとかしてクライアントの要求に応えようとするとハマルわけですね。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加