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

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

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

全過去ログを検索

<< 0 >>
■3437  Re[3]: ボタンクリックせずに。
□投稿者/ 所 -(2007/05/10(Thu) 15:16:06)
    No3436 (επιστημη さん) に返信
    >>ちなみにイベントでKey upとかPressってありますよね?
    >>それで表示することは出来ないのですかね??
    >
    > そんなん訊くよなことちゃうやろ。やってみりゃえーやん。
    > # つか、なんでそんなことしたいんす? TextChangedのドコがあかんの?


    やってみました。
    何も変わりませんでした。
    機能としては同じなんですかね?
    それともこのプログラムだと関与しないだけのイベントなんですかね?
記事No.3432 のレス /過去ログ12より / 関連記事表示
削除チェック/

■6725  Re[3]: フォームの最大&印刷について
□投稿者/ 渋木宏明(ひどり) -(2007/08/22(Wed) 19:06:07)
>
    > やはり、画面に見えている部分のみしか
    > 印刷はされないんでしょうか?

    されないと思います。

    表示されて無い箇所の描画を行わないのが Vista 以前の Windows GDI の仕様なので。
記事No.6688 のレス /過去ログ17より / 関連記事表示
削除チェック/

■62861  Re[5]: データベースの参照ができません
□投稿者/ NF64 -(2011/11/06(Sun) 22:56:17)
    2011/11/06(Sun) 22:57:08 編集(投稿者)

    データベースを手軽に使いたいなら、SQLServer CompactやSQLiteの使用を検討してみるのも良いでしょう。
記事No.62848 のレス /過去ログ105より / 関連記事表示
削除チェック/

■87777  C#からExcelマクロの実行
□投稿者/ はるかぜ -(2018/06/29(Fri) 15:08:33)

    分類:[C#] 

    Microsoft.Office.Interop.Excelを使用してC#からExcelのFunctionを呼んでその戻り値を取得したいと思っています。

    VBAは以下のものを「標準モジュール」の場所に作り、Excel上で実行した時は正常に動作することを確認しています。
    (JsonConverterも標準モジュールにインポートしてあります)

    Public Function ToDotNet() As String
    Dim json As Object
    Set json = CreateObject("Scripting.Dictionary")
    Dim sheet As Worksheet
    Dim arinashi As Boolean

    If Sheets(1).rbtnAri.Value Then
    arinashi = True
    Else
    arinashi = False
    End If

    json.Add "AriNashi", arinashi
    json.Add "Check1", Sheets(1).chk1.Value
    json.Add "Check2", Sheets(1).chk2.Value
    json.Add "Check3", Sheets(1).chk3.Value

    ToDotNet = JsonConverter.ConvertToJson(json)

    End Function

    これをC#から実行してjsonを受け取るために以下のコードを書きました。

    Microsoft.Office.Interop.Excel.Application app = null;
    try
    {
    app = new Microsoft.Office.Interop.Excel.Application();
    app.Visible = true;
    var fi = new FileInfo("Template\\template.xlsm");
    var book = app.Workbooks.Open(fi.FullName);
    var ret = app.Run("ToDotNet");
    book.Close();
    Marshal.ReleaseComObject(book);
    richTextBox1.Text = ret;
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    finally
    {
    if (app != null)
    {
    app.Quit();
    }
    app = null;
    }

    結果は
    「マクロ'ToDotNet'を実行できません。このブックでマクロが使用できないか、またはすべてのマクロが無効になっている可能性があります。」
    となります。

    Excelのセキュリティ設定(マクロとActiveXコントロール)をすべて有効(セキュリティなし)にしてみたり、
    app.Run("ToDotNet");
    の引数を
    "'ブック名'!ToDotNet
    にしたり、
    "'Excelファイルのフルパス'!ToDotNet"
    にしたりしてみましたがすべて同じでした。

    どうすれば実行できますか?
親記事 /過去ログ151より / 関連記事表示
削除チェック/

■87782  Re[1]: C#からExcelマクロの実行
□投稿者/ 魔界の仮面弁士 -(2018/06/29(Fri) 15:49:47)
    2018/06/29(Fri) 16:15:11 編集(投稿者)
    2018/06/29(Fri) 15:50:16 編集(投稿者)

    No87777 (はるかぜ さん) に返信
    > var book = app.Workbooks.Open(fi.FullName);
    ではなく、
     books = app.Workbooks;
     book = books.Open(fi.FullName);
    にします。


    > Marshal.ReleaseComObject(book);
    book の解放に加えて、books の解放も必要です。
     if( Marshal.IsComObject( books ) ) { Marshal.ReleaseComObject(books); }

    変数 app も同様に ReleaseComObject しましょう、Quit 後に。



    一方 VBA 側は、下記を直した方が良いでしょう。

    > If Sheets(1).rbtnAri.Value Then
    Sheets(1) というのが、どのワークブックのシートなのか示されていません。

    ThisWorkbook ≠ ActiveWorkbook な可能性もあるわけですから、
    「Sheets(1)」ではなく、「対象のワークブックを表す変数.Worksheets(1)」などに
    置き換えておくのが望ましいです。



    > すべてのマクロが無効になっている可能性があります。
    たとえば
     Public Function ToDotNet() As String
      ToDotNet = "{""" & Format(Now, "yyyy/MM/dd HH:mm:ss") & """}"
     End Function
    のような、単純な VBA だった場合も、呼び出しに失敗しますか?

    単純なものであれば呼び出せるようであれば、VBA コードのどの部分が
    問題になっているのかを調べてみては如何でしょう。


    # 出遅れすぎた。
    ## しかも解決済み付け忘れてた。
記事No.87777 のレス / END /過去ログ151より / 関連記事表示
削除チェック/

■87784  Re[2]: C#からExcelマクロの実行
□投稿者/ はるかぜ -(2018/06/29(Fri) 17:13:53)
    お二方とも回答ありがとうございます。

    No87782 (魔界の仮面弁士 さん) に返信
    >>Marshal.ReleaseComObject(book);
    > book の解放に加えて、books の解放も必要です。
    >  if( Marshal.IsComObject( books ) ) { Marshal.ReleaseComObject(books); }
    >
    > 変数 app も同様に ReleaseComObject しましょう、Quit 後に。
    >
    >>If Sheets(1).rbtnAri.Value Then
    > Sheets(1) というのが、どのワークブックのシートなのか示されていません。
    >
    > ThisWorkbook ≠ ActiveWorkbook な可能性もあるわけですから、
    > 「Sheets(1)」ではなく、「対象のワークブックを表す変数.Worksheets(1)」などに
    > 置き換えておくのが望ましいです。
    >

    ComObjectを使用したExcelの操作自体は経験がありこのようなことも承知していましたが今回はC#とExcel間でJsonのやり取りができるのか確認したかっただけなのでそのへんは適当でした(笑
    とりあえずこのエラーが言葉通りの意味でなく、呼び出すマクロが見つからない時やマクロ自体に問題がある時にもでるということがわかったので今後はそういった視点でもチェックするようにします。
記事No.87777 のレス / END /過去ログ151より / 関連記事表示
削除チェック/

■87779  Re[1]: C#からExcelマクロの実行
□投稿者/ はるかぜ -(2018/06/29(Fri) 15:30:08)
    新規にファイルを作り直して単純にtestという文字列だけ返すFunctionのみを作成したらうまく行ったので
    それをもとにJsonConvertを組み込んでVBAも書き換えていったらC#でJsonを取得することができるようになりました。

    出来上がったファイルを見比べてみても何が違うのか全くわからないのですが動いたので解決にしておきます。
記事No.87777 のレス / END /過去ログ151より / 関連記事表示
削除チェック/

■87780  Re[2]: C#からExcelマクロの実行
□投稿者/ PANG2 -(2018/06/29(Fri) 15:33:12)
    2018/06/29(Fri) 15:33:55 編集(投稿者)

    まずは、Hello World から

    Public Function ToDotNet() As String
    ToDotNet = "Hello World"
    End Function

    # 出遅れた
記事No.87777 のレス / END /過去ログ151より / 関連記事表示
削除チェック/

■94621  別アプリのリストボックス上のフォーカス行をWクリックしたい
□投稿者/ Tom -(2020/04/25(Sat) 10:18:57)

    分類:[C#] 

    開発環境:VisualStudio 2017
    使用言語:C#

    別アプリを制御しようとしています。
    やりたいことは別アプリ上のリストボックスのフォーカス行をダブルクリックなのですが、
    当然ながらマウスポインタは全然別の場所に居ます。

    また、別アプリのフォーカス行はリストボックスの可視位置に居るのですが、
    そのリストボックスがマウスカーソルがそこまで届かない場所(デスクトップ描画外)にいる場合はありえます。

    そもそもこんなことが可能なのでしょうか?
    方法すら皆目思いつきません。

    賢者の方、アドバイスを頂けませんでしょうか?
親記事 /過去ログ164より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -