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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 | 1 >>
■89994  Re[8]: リッチテキストボックスでカラー情報をコピーする方法
□投稿者/ イエメン -(2019/01/28(Mon) 20:16:26)
    仰るとおり、Escキーを押すとうまくペーストできました。
    ただ、コピーする前に押さないといけないのですね。

    できれば、このExcelのコピー状態をキャンセルすることも
    プログラム上でできないでしょうか?
記事No.89928 のレス /過去ログ155より / 関連記事表示
削除チェック/

■89995  Re[9]: リッチテキストボックスでカラー情報をコピーする方法
□投稿者/ 魔界の仮面弁士 -(2019/01/28(Mon) 20:33:17)
    No89994 (イエメン さん) に返信
    > このExcelのコピー状態をキャンセルすることも
    > プログラム上でできないでしょうか?

    コピー元 Excel の CutCopyMode プロパティに False を代入してみてください。
記事No.89928 のレス /過去ログ155より / 関連記事表示
削除チェック/

■89998  Re[10]: リッチテキストボックスでカラー情報をコピーする方法
□投稿者/ イエメン -(2019/01/29(Tue) 10:54:50)
    ありがとうございます。


    Dim xlApp = CreateObject("Excel.Application")
    CallByName(xlApp, "CutCopyMode", CallType.Method, False)

    これをどこかに入れれば良いのでしょうか?

    Clipboard.Clear()の前に入れるとエラーが出て実行できず、
    Tryの後に入れると、エラーは出ないけれど
    コピー状態をキャンセルできないのですが、

    どのようにしたら良いですか?
記事No.89928 のレス /過去ログ155より / 関連記事表示
削除チェック/

■90000  Re[11]: リッチテキストボックスでカラー情報をコピーする方法
□投稿者/ 魔界の仮面弁士 -(2019/01/29(Tue) 12:24:57)
    No89998 (イエメン さん) に返信
    > Dim xlApp = CreateObject("Excel.Application")
    起動済みのインスタンスを拾うので、
     Dim xlApp = GetObject( , "Excel.Application")
    にしておいてください。

    GetObject がエラーになる場合は、そもそも Excel が起動していない状態なので
    その場合はそもそも、CutCopyMode を操作する必要がありません。


    もしも複数の Excel.Application インスタンスが生成されていた場合には、
    それらを区別して取得するために、IRunningObjectTable から得る必要が
    あるかも知れませんが……大抵は GetObject だけでなんとかなるはず。



    > CallByName(xlApp, "CutCopyMode", CallType.Method, False)
    それだと
     xlApp.CutCopyMode(False)
    相当の意味になってしまいますね。

    必要なのは
     xlApp.CutCopyMode = False
    に相当する呼び出しなので、Option Strict On で書くなら
     CallByName(xlApp, "CutCopyMode", CallType.Let, False)
    です。

    処理後は xlApp の COM オブジェクト解放も忘れずに。



    > これをどこかに入れれば良いのでしょうか?
    「Excel からコピーして Word に貼り付けた後」もしくは
    「RichTextBox からコピーして Word に貼り付ける前」のタイミングですかね。
記事No.89928 のレス /過去ログ155より / 関連記事表示
削除チェック/

■90001  Re[12]: リッチテキストボックスでカラー情報をコピーする方法
□投稿者/ イエメン -(2019/01/29(Tue) 12:41:07)
    ありがとうございます。


    RichTextBox1.Copy()
    の後に

    Dim xlApp = GetObject(, "Excel.Application")
    CallByName(xlApp, "CutCopyMode", CallType.Let, False)
    If xlApp IsNot Nothing AndAlso Marshal.IsComObject(xlApp) Then Marshal.ReleaseComObject(xlApp)

    を入れたのですが、
    コピーすることで、Excel上でセルを選択している表示は解除されることを確認できました。
    しかし、Excel上でペーストしてもデータが代入されません、

    再度、コピーをやり直すとうまくいくのですが・・・

    なぜ1回でうまくいかないのでしょうか?
記事No.89928 のレス /過去ログ155より / 関連記事表示
削除チェック/

■90002  Re[13]: リッチテキストボックスでカラー情報をコピーする方法
□投稿者/ イエメン -(2019/01/29(Tue) 12:45:09)

    Clipboard.Clear()
    の前に入れたところ、
    1回目で文字列は代入されるようになったのですが、
    カラーフォントなどがペーストされず、書式無しの文字列になってしまいます。

    そして2回目ペーストすると今度はなぜかうまくいくのですが・・・
    一体なぜでしょうか?
記事No.89928 のレス /過去ログ155より / 関連記事表示
削除チェック/

■90004  Re[13]: リッチテキストボックスでカラー情報をコピーする方法
□投稿者/ 魔界の仮面弁士 -(2019/01/29(Tue) 13:11:26)
    No90001 (イエメン さん) に返信
    > コピーすることで、Excel上でセルを選択している表示は解除されることを確認できました。
    > しかし、Excel上でペーストしてもデータが代入されません、

    Excel に対する CutCopyMode のキャンセル処理と
    RichTextBox からのコピー処理を、
    同じイベント内に続けて記載していませんか?

    メッセージループが回らないと、クリップボードは処理されませんので、
    CutCopyMode を操作するためのボタンだけを、単独で配置してみてください。


    一回のボタン操作で行われるようにしたいのなら、
    CutCopyMode を操作した後のクリップボード処理を遅延実行させてみてください。

    たとえば Application.Idle イベントで処理させるようにするとか、
    Control.BeginInvoke なり Task.ContinueWith メソッドなりに分けるとか。
記事No.89928 のレス /過去ログ155より / 関連記事表示
削除チェック/

■90005  Re[14]: リッチテキストボックスでカラー情報をコピーする方法
□投稿者/ イエメン -(2019/01/29(Tue) 14:02:16)
    ありがとうございます。

    Thread.Sleep(100)
    を入れるとうまくいきました。

    ただ、文字列のサイズによっては100 msecでは足りない時があるかも知れません。

    ちなみになのですが

    たとえば Application.Idle イベントで処理させるようにするとか、
    Control.BeginInvoke なり Task.ContinueWith メソッドなりに分けるとか。

    これらはどのようにして使用するものなのでしょうか?
    この方法なら、操作が終わるまで待機するようなことが可能なのでしょうか?
記事No.89928 のレス /過去ログ155より / 関連記事表示
削除チェック/

■90006  Re[15]: リッチテキストボックスでカラー情報をコピーする方法
□投稿者/ 魔界の仮面弁士 -(2019/01/29(Tue) 14:24:48)
    2019/01/29(Tue) 14:28:45 編集(投稿者)

    No90005 (イエメン さん) に返信
    > Thread.Sleep(100)
    > を入れるとうまくいきました。

    UI スレッドで Sleep を呼びだすことは避けてください。



    > これらはどのようにして使用するものなのでしょうか?

    たとえば BeginInvoke ならこうかな。
    掲示板に直接書いたので未検証ですけど。


    Private Sub ButtonX_Click(…
     Dim oldCursor = Cursor.Current
     Cursor.Current = Cursors.WaitCursor

     Dim xlApp As Object = Nothing
     Try
      xlApp = GetObject(, "Excel.Application")
      CallByName(xlApp, "CutCopyMode", CallType.Let, False)
     Catch
     Finally
      If xlApp IsNot Nothing AndAlso Marshal.IsComObject(xlApp) Then Marshal.ReleaseComObject(xlApp)
     End Try
     BeginInvoke(Sub()
      Try
       Clipboard.Clear()
       RichTextBox1.Copy()

       Dim wApp As Object = Nothing
       '中略
       Try
        wApp = CreateObject("Word.Application")
        '中略
        CallByName(wRng, "Paste", CallType.Method)
        CallByName(wRng, "Copy", CallType.Method)
       Catch
       Finally
        '中略
       End Try
      Catch
      Finally
       Cursor.Current = oldCursor
      End Try
     End Sub)
    End Sub
記事No.89928 のレス /過去ログ155より / 関連記事表示
削除チェック/

■90007  Re[16]: リッチテキストボックスでカラー情報をコピーする方法
□投稿者/ イエメン -(2019/01/29(Tue) 14:44:40)
    ありがとうございます。
    
    以下のようにしてみましたが、やはり1回目ではうまくいかず2回ペーストする必要があります。
    
    BeginInvokeは非同期でバックグラウンドプロセスからフォアグラウンドプロセスに指令を投げるものだと思いますが、
    GUIから使っても良いのでしょうか?
    そして、それで遅延が発生するのでしょうか?
    
                Dim oldCursor = Cursor.Current
                Cursor.Current = Cursors.WaitCursor
    
                Dim xlApp As Object = Nothing
                Try
                    xlApp = GetObject(, "Excel.Application")
                    CallByName(xlApp, "CutCopyMode", CallType.Let, False)
                Catch
                Finally
                    If xlApp IsNot Nothing AndAlso Marshal.IsComObject(xlApp) Then Marshal.ReleaseComObject(xlApp)
                End Try
                BeginInvoke(Sub()
    
                                Clipboard.Clear()
                                RichTextBox1.Copy()
    
    
                                ' Excel 書式を維持するため、Word 経由で複写
                                Dim wApp As Object = Nothing
                                Dim wDocs As Object = Nothing
                                Dim wDoc As Object = Nothing
                                Dim wRng As Object = Nothing
    
                                Try
    
                                    wApp = CreateObject("Word.Application")
                                    wDocs = CallByName(wApp, "Documents", CallType.Get)
                                    wDoc = CallByName(wDocs, "Add", CallType.Method)
                                    wRng = CallByName(wDoc, "Range", CallType.Method)
                                    CallByName(wRng, "Paste", CallType.Method)
                                    CallByName(wRng, "Copy", CallType.Method)
                                Catch
                                Finally
                                    If wRng IsNot Nothing AndAlso Marshal.IsComObject(wRng) Then Marshal.ReleaseComObject(wRng)
                                    If wDoc IsNot Nothing AndAlso Marshal.IsComObject(wDoc) Then Marshal.ReleaseComObject(wDoc)
                                    If wDocs IsNot Nothing AndAlso Marshal.IsComObject(wDocs) Then Marshal.ReleaseComObject(wDocs)
                                    If wApp IsNot Nothing AndAlso Marshal.IsComObject(wApp) Then
                                        CallByName(wApp, "Quit", CallType.Method, False)
                                        Marshal.FinalReleaseComObject(wApp)
                                    End If
                                End Try
    
                                Cursor.Current = oldCursor
    
                            End Sub)
    
記事No.89928 のレス /過去ログ155より / 関連記事表示
削除チェック/

■90008  Re[17]: リッチテキストボックスでカラー情報をコピーする方法
□投稿者/ 魔界の仮面弁士 -(2019/01/29(Tue) 15:57:06)
    No90002 (イエメン さん) に返信
    > 1回目で文字列は代入されるようになったのですが、
    > カラーフォントなどがペーストされず、書式無しの文字列になってしまいます

    うまくいかない「1 回目」の時に、クリップボード内に
    "HTML Format" なデータは含まれていましたか?


    "HTML Format" が含まれていない場合は、Debug.WriteLine 等を仕込んで、
    Word 側の呼び出しコードが呼び出されているかどうかを確認してみてください。


    "HTML Format" が含まれているのに、それでも正しく受け渡せないなら、
    クリップボードの格納順や内容が、1 回目と 2 回目でどのように変化しているか
    確認してみてください。


    ひとまず Sleep や DoEvents を入れた方が安定するのなら、
    幾許かの待機処理は入れておいた方が良いのかも。



    No90007 (イエメン さん) に返信
    > やはり1回目ではうまくいかず2回ペーストする必要があります。

    何も貼れないときは、クリップボード操作がエラーになっているのかな…。

    Word を操作しても "HTML Format" が含まれていないようなら、
    Word 側へのペースト&コピーが失敗して Catch 句を通過していないかをチェックしてみてください。
    ※例: ExternalException (0x800401D0 = CLIPBRD_E_CANT_OPEN)

    もしエラーになるようなら、引数 4 個な Clipboard.SetDataObject メソッドの実装のように、
    失敗時に一定間隔で再試行するような実装を設ける必要があるかもしれません。


    # 今ちょっと、試せる環境が手元に無い…。
記事No.89928 のレス /過去ログ155より / 関連記事表示
削除チェック/

■90011  Re[18]: リッチテキストボックスでカラー情報をコピーする方法
□投稿者/ イエメン -(2019/01/30(Wed) 12:30:38)
    また、お時間ある時に試していただけないでしょうか?
    宜しくお願いいたします。


記事No.89928 のレス /過去ログ155より / 関連記事表示
削除チェック/

■90086  Re[19]: リッチテキストボックスでカラー情報をコピーする方法
□投稿者/ イエメン -(2019/02/07(Thu) 13:26:16)
    ちなみに、この方法だとフォントサイズをコピーすることができないのですが、
    なぜでしょうか?
    Excel→Word→Excelだと
    うまくサイズも移行できるのですが。
記事No.89928 のレス /過去ログ155より / 関連記事表示
削除チェック/

■90087  Re[20]: リッチテキストボックスでカラー情報をコピーする方法
□投稿者/ イエメン -(2019/02/07(Thu) 13:28:34)
    気のせいでした
    うまくいきました
記事No.89928 のレス /過去ログ155より / 関連記事表示
削除チェック/

■97286  Re[23]: VS2019 + Access MDBでエラーが発生
□投稿者/ てっちゃん -(2021/04/21(Wed) 17:14:43)
    No97285 (魔界の仮面弁士 さん) に返信

    魔界の仮面弁士様

    > 原因を突き止めないと安心はできませんが、ひとまず回避策が見つかって良かったです。

    おかげさまで開発に向けて一歩進むことが出来ました。
    当初の主キーが日本語だと編集・削除が出来ないという状況では、現行システム側との
    兼ね合いもありかなりの工数がかかるのではと心配しておりました。
    本当にありがとうございました。

    > ファイル以外の要因(たとえば、特定の環境と設定の組み合わせなど)に
    > 依存していたりすると、再発の危険性は否定できませんけれども。

    そうなると開発環境と実行環境が違うと起きるかもしれませんね。

    > >>> キー : [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Sorting\Versions]

    レジストリを確認したところ名前とデータは下記の通りでした。(種類は全てREG_SZ)

    (既定) 00060305
    000601xx SortWindows61.dll
    000602xx SortWindows62.dll
    000603xx kernel32.dll
    FF0000xx SortServer2003Compat.dll
    FF0406xx SortWindows6Compat.dll
    FF0502xx SortWindows6Compat.dll

    > 少なくとも 1 行目と 3 行目で発生したことが確認されており、
    > かつ、文字列の内容に依存しているわけでは無さそう、ということですね。

    エラーが発生した時は半角の「1」でも全角の「あ」でも発生しました。
    ですので文字列の内容に依存しているわけでは無いと思います。


    > Windows Update の最終更新日はいつですか?

    4/14にKB5001330とServicing Stack 10.0.19041.925 の更新履歴があります。

    よろしくお願いいたします。

記事No.97237 のレス /過去ログ169より / 関連記事表示
削除チェック/

<前の20件

<< 0 | 1 >>

パスワード/

- Child Tree -