C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: Excelのセル範囲コピー


(過去ログ 112 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■66348 / inTopicNo.1)  Excelのセル範囲コピー
  
□投稿者/ どっとくりあ (7回)-(2013/04/17(Wed) 12:03:41)

分類:[.NET 全般] 

大変お世話になっております。
Excelのセル範囲コピーをしたいのですが、うまくタイミングがとれないようなので教えて下さい。
Excelであらかじめ、セル範囲を指定しておいて、Button4をクリックした時に、クリップボードに入れて、
その内容を処理するものです。
Private Sub Button4_Clickを起動すると、取得出来たり、出来なかったりします。タイマーとか、MsgBoxとか
入れて色々試しましたが、ダメでした。インスタンス??良くわかりませんです。
excel_copyのサブを別ボタンで起動して、Private Sub Button4_Clickの中の’★★★以下を別ボタンで起動すると
うまく取得出来ます。どうすれば一度の処理(Private Sub Button4_Click内とか)で可能でしょうか?


Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

excel_copy() 'Excelから現在選択されているセルの内容をコピーする。
’★★★

'クリップボードのデータを取得する
Dim data As IDataObject = Clipboard.GetDataObject()
Dim ms As System.IO.MemoryStream = _
DirectCast(data.GetData(DataFormats.CommaSeparatedValue), System.IO.MemoryStream)
If Not ms Is Nothing Then
Dim sr As New System.IO.StreamReader(ms, System.Text.Encoding.Default)
'エンコードして、文字列に変換する
Dim str As String = sr.ReadToEnd()
Lb_cb1.Text = str
Dim sw As New System.IO.StreamWriter(Application.StartupPath & "\1.csv", _
False, _
System.Text.Encoding.GetEncoding("shift_jis"))
sw.Write(str)
sw.Close()
End If
End Sub

Sub excel_copy() 'Excelから現在選択されているセルの内容をコピーする。
CC_ac() 'Excelアクティブ
SendKeys.Send("{ESC}")
SendKeys.Send("^c") 'Excelの現在範囲をコピーする
End Sub

Sub CC_ac() 'Excelをアクティブにする。
On Error Resume Next
Dim p As System.Diagnostics.Process
For Each p In System.Diagnostics.Process.GetProcesses()
If Not IntPtr.Zero.Equals(p.MainWindowHandle) Then
If p.ProcessName = "EXCEL" Then
ActivateWindow(p.MainWindowTitle)'Excelをアクティブにする。
End If
End If
Next
End Sub

引用返信 編集キー/
■66350 / inTopicNo.2)  Re[1]: Excelのセル範囲コピー
□投稿者/ しま (5回)-(2013/04/17(Wed) 12:37:10)
No66348 (どっとくりあ さん) に返信
開発環境、動作環境について書いてください
VB dotNet らしいことは分りますが、OS のバージョンとか、 VS のバージョン、エディションとか色々示して欲しいことがあります

>Excelであらかじめ、セル範囲を指定しておいて、Button4をクリックした時に、クリップボードに入れて、
>その内容を処理するものです。
>Private Sub Button4_Clickを起動すると、取得出来たり、出来なかったりします。タイマーとか、MsgBoxとか
>入れて色々試しましたが、ダメでした。インスタンス??良くわかりませんです。
>excel_copyのサブを別ボタンで起動して、Private Sub Button4_Clickの中の’★★★以下を別ボタンで起動すると
>うまく取得出来ます。どうすれば一度の処理(Private Sub Button4_Click内とか)で可能でしょうか?

エクセルは、別途起動しておいて今回のアプリケーションでクリップボードにコピーしたいということですか?
Button4 があなたのクリップボード操作をしようとしているアプリケーションのボタンなのは自明でしょうか?

また、取得できないとはどういうことを指していますか?
 クリップボードにコピーできていない?
 クリップボードに別のデーターがある?
 あなたが施したい処理が(例外などで)出来ない?

もう少し、説明してください
引用返信 編集キー/
■66352 / inTopicNo.3)  Re[2]: Excelのセル範囲コピー
□投稿者/ どっとくりあ (8回)-(2013/04/17(Wed) 12:56:52)
すみません、大変な情報不足で
VB.NET2005 Windows7 Excel2003SP3
現象
Excelが範囲が点線にならずに、コピー状態とならない事がある。
Excelが範囲が点線になってコピーされているが、'★★★から下の処理が出来ない事がある。
場合によって、全てうまく動作する場合もある。
この様にいろんな場合が発生するので、まずは、SendKeys.Sendの前後等にタイマーを入れたり
excel_copyの処理の後にMsgBoxを入れたり、マルチスレッド処理にして、excel_copyのあとに
クリップボードに入ってくるまで待ち処理にとか試みましたが、
効果が特定出来ませんでした。(マルチスレッド処理は経験ないので参考にはなりませんが)
先に書いた様にexcel_copyのサブを別ボタンで起動してやると、タイマー等が不要で、動作しました。

引用返信 編集キー/
■66361 / inTopicNo.4)  Re[3]: Excelのセル範囲コピー
□投稿者/ しま (6回)-(2013/04/18(Thu) 02:59:11)
No66352 (どっとくりあ さん) に返信
クリップボードにコピーして、クリップボードからコピーしたデーターを取得して処理するということにこだわるのなら、
現在うまくいっている手順で良いのではないかと思います。

SendKeys で上手くいかないのは、おそらく
あなたのアプリケーション(A と呼ぶことにする)からキーを押しましたよとエクセル(E と呼ぶことにする)にメッセージを送信しても
E は直ちにキーメッセージを扱えるわけではないことが原因だろうと考えるからです。
Windows はマルチタスクなOSですが、プロセスを切替えてマルチタスクを実現しているので A と E とが並行(並列?)に同時に動いているわけではなく、
A や OS が動いている期間は E や他のプロセス(タスク)は止っています。なので、A が活動を他に譲らない限り A に割当てられた時間間隔の間は
(正確な表現ではありませんが...)E は止まっています。SnedKeys でキーを押し離したと通知を送っても 100mS 程度の時間を空けないと E は
コピーを作る動作が出来ないでしょう。また、 100mS 経ったから、 E に順番が回ってくる保障も有りません。

そこで、別の手段で、エクセル上で範囲指定してその範囲をドラッグアンドドロップによってあなたのアプリケーションで受取るというのはどうでしょうか?
これなら、ドラッグが始まった時にはエクセルが生きていて、ドラッグ用のデーターもエクセルが用意できているはずだろうと考えるからです。
引用返信 編集キー/
■66366 / inTopicNo.5)  Re[4]: Excelのセル範囲コピー
□投稿者/ shu (285回)-(2013/04/18(Thu) 09:26:37)
No66361 (しま さん) に返信

クリップボードを使うのは必須なのでしょうか?
Excelは既に開いているのが前提なのでしょうか?

Excel.Application, Rangeオブジェクトなどを使用して
データを取得するのは駄目ですか?
引用返信 編集キー/
■66378 / inTopicNo.6)  Re[5]: Excelのセル範囲コピー
□投稿者/ どっとくりあ (9回)-(2013/04/18(Thu) 17:14:11)
クリップボードを使うのは必須と言う事ではありません。
Excelの表の一部分とか、細かく選択出来る様にと言う意味で、クリップボードを選択しました。
上記の理由によりExcelは既に開いているのを前提としました。
皆さんおっしゃる様に、もっとすっきり方式の方が良かった様に思いますが、既に回りは出来てますので、
操作は2クリック必要ですが、この方法ですすめる事にします。
また、csvファイルからこの処理を行うモードも考えている為に、皆さんがおっしゃる方法を
こちらで実現したいと思います。
ご回答大変有り難う御座いました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -