- ベストアンサー
DataGridViewからエクセルに貼り付けるとエクセルが落ちる!対処法は?
- DataGridViewの値をExcelにコピペしようとすると文字化けしてしまう。Excel貼り付け時にHTMLで解釈されてしまうため、右クリック→形式を選択して貼り付けると文字化けしなくなるが、忘れてそのまま貼り付けるとExcelファイルが強制シャットダウンする。
- DataGridView上のフォーマットをテキストにしておくか、コピーされた際にクリップボードのフォーマットを変更する方法があればよい。
- 対処法について詳しい方はアドバイスをお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
とりあえず簡単に作ってみました。 ContextMenuStrip1とDataGridView1をフォームに追加してください。 適当なデータをDataGridView1に表示できるようにしてください。 ContextMenuStrip1に項目を追加します。 コピーを追加します。 DataGridView1のReadOnlyをTrueにします、ContextMenuStripにContextMenuStrip1を設定します。 Private Sub コピーToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles コピーToolStripMenuItem.Click Dim cells As New List(Of DataGridViewCell) Dim colPos As New List(Of Integer) For Each Cell As DataGridViewCell In DataGridView1.SelectedCells If colPos.IndexOf(Cell.ColumnIndex) < 0 Then colPos.Add(Cell.ColumnIndex) End If cells.Add(Cell) Next cells.Sort(AddressOf CellSort) Dim colcount As Integer = colPos.Count Dim s As New System.Text.StringBuilder Dim col As Integer = 0 For i As Integer = 0 To cells.Count - 1 s.Append(cells(i).Value.ToString) col += 1 If colcount = col Then s.Append(vbCrLf) col = 0 Else s.Append(vbTab) End If Next Clipboard.SetText(s.ToString) End Sub Function CellSort(ByVal x As DataGridViewCell, ByVal y As DataGridViewCell) As Long 'Rowを優先して並び替え Dim ret As Long = (x.RowIndex - y.RowIndex) * 100000 + (x.ColumnIndex - y.ColumnIndex) Return ret End Function Private Sub DataGridView1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DataGridView1.KeyDown 'コピーのショートカットキーを無効化します e.SuppressKeyPress = True End Sub
その他の回答 (2)
- AKARI0418
- ベストアンサー率67% (112/166)
では、別の方法を・・・。 直接DataGridViewから情報をコピーするのではなくて、 一度ソースを介するのであれば可能ではないでしょうか? Forms.Clipbordクラスを使用すればよいのです。 DataGridViewの選択されている範囲を取得することはできるわけですから、その情報からクリップボードにコピーする内容を編集し、クリップボードにセットすればよいというわけです。 問題はクリップボードに格納するときの型です。 文字列でうまくいくのか? 一応、2次元の配列にし、ペーストする範囲を指定すれば、コピーできます。 それともExcelクラス(Office.Interlopでしたっけ?)のRangeを使用するのか。 はたまた、バックグラウンドでEXCELを起動し、編集して、コピーしてくるかの方法が必要かもしれません。
お礼
AKARI0418 様 どうもありがとうございます! DataObject data = new DataObject(); data.SetText(html, TextDataFormat.Html); data.SetText(html, TextDataFormat.Text); Clipboard.SetDataObject(data); というのがネットにあったので調べておりましたが http://msdn.microsoft.com/ja-jp/library/tbfb3z56.aspxを見ても 私には理解できません... 難しそうなので,ご提案いただいた >バックグラウンドでEXCELを起動し、編集して、コピーしてくる の方向でやろうと思うのですが,「コピーされたタイミング」というのは 拾うことはできるのでしょうか??? アドバイスいただいた後,イベントの種類でDataGridView_~で始まるものに 一通り目を通してみましたがそれらしいものを見つけられませんでした. 「DataGridViewを選択できないようにしておいて,ボタンを押すことで クリップボードにデータを入れる」とも考えたのですが,そうすると DataGridView上で範囲選択できなくなってしまいます... 教えていただいている立場にも関わらず,厚かましくてもうしわけございませんが, もし何か思いつくことがございましたら是非ともアドバイスいただけないでしょうか... どうぞよろしくお願いいたします.
- AKARI0418
- ベストアンサー率67% (112/166)
>DataGridViewの値をExcelにコピペしようとすると文字化けしてしまうのですが, 皆さんどうのように対処してらっしゃいますか??? VB.NET上で扱われているデータはUnicodeですが、ExcelはShift-Jisだからです。 DataGridViewの値をExcelにコピペしようとすること自体やったことがありません。 コピペするくらいでしたら、Excelにそのまま出力してしまったほうが早いからです。 DataGridViewの値をExcelにコピペしなければならない理由がないのでしたら、直接Excelに出力するか、CSVファイルとして出力することをお勧めします。
お礼
AKARI0418様 どうもありがとうございます. 社内で皆のエクセルデータ作成を補助するアプリを作成しております. エクセル出力の方向もありなのですが,既存エクセルファイル保護と 作業の手間を懸念している次第でございます. ・(既存データ保護のため)DataGridView上でコピーできないようにする ・データコピーしたい際のみ,ボタンか何かを押してもらいその都度作成した エクセルファイルを開いてもらいコピペしてもらうよう作業徹底する. 作成したファイルは毎回削除してもらう. とするのが手間なので,何かよい方法は無いものかなー?と探しております. ご親切にアドバイスいただきどうもありがとうございました.
お礼
AKARI0418 様 どうもありがとうございました!全部うまくいきました! (まだちゃんと理解できてない行がありますが..orz) 知らない機能がいくつかあったのでかなり勉強にもなりました. 自分も早くこういうコードをぱぱっと作れるレベルになりたいです.. こんなに詳しく自分のやりたいことを的確にアドバイスいただけるとは 考えておりませんでした.閲覧していただけてよかったです!m(_ _)m 本当にどうもありがとうございました!!
補足
うわすごい..今拝見させていただきました! >とりあえず簡単に作ってみました。 (^^;)簡単ですか???すごいです. 試させていただいてから再度あらためてお礼させていただきます. (理解しきるのに時間がかかりそうですが..) 本当にどうもありがとうございます!!