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

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

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

全過去ログを検索

<< 0 | 1 | 2 >>
■86416  Re[5]: Listを使ったクラスへのアクセスについて
□投稿者/ 魔界の仮面弁士 -(2018/01/26(Fri) 17:29:50)
    No86393 (MTK さん) に返信
    > BasicButton とか ManagerMenu といった命名の方がいいということですよね?

    非英語圏の単語を並べる場合はさておき、
    「英単語」を並べる場合には、英語の語順が良いと個人的には思います。

    ただ重要なのはむしろ、プロジェクト全体で統一の取れた命名規約を保つことですね。


    ちなみにスーパークラス専用となる基底クラスでは、
    しばしば「〜Base」と命名されることがあります。

     System.Windows.Forms.ButtonBase ← Button / CheckBox / RadioButton など
     System.Windows.Forms.TextBoxBase ← TextBox / RichTextBox / MaskedTextBox など

    と言っても、すべてのスーパークラスがそういう命名になるわけでは無いのですが。

     System.Windows.Forms.ListControl ← ComboBox / ListBox など
     System.Windows.Forms.CommonDialog ← FolderBrowserDialog / FontDialog など


    No86411 (MTK さん) に返信
    >> ボタンを押せば、その機能を使うための別ウインドウが開くようにしたいと考えています。
    >> ボタン毎の画像や挙動を分けるためにも、分けています。
    > 昨日の回答を頂いて色々考えた結果、現在はbuttonをbuttonBasicクラスに継承して

    Form クラスを継承して Form1 クラスを作るのが一般的であるように、
    「Button クラスを継承した buttonBasic クラス」を継承して buttonA クラスを
    作るという設計にするのも一つの方針ですし、要件次第ではありますね。

    ボタンから呼び出される個別の処理を定義する場合は、ボタンクラスへの実装ではなく、
    ボタンのインスタンスに対してイベントを割り当てて実装するようにし、
    ボタンそのものの汎用的な振る舞いを定義する場合(長押しとかトリプルクリックとか)は、
    ボタンクラスへの実装にすることが多いです、私は。

    なお、継承を用いて実装する場合は、自クラスのイベントに処理を書くのではなく、
    イベントを呼び出すためのメソッド(OnClick など)をオーバーライドする方が望ましいです。
    https://opcdiary.net/?p=3966


    > Enabled か Visuble かは、どちらにするかちょっと悩んでみます。
    Visuble ではなく Visible ですね。


    > Enabledで管理すると、一般ユーザに管理者用機能名が知られてしまう(これが問題になりうるか)

    特定のユーザーしか使わない機能は、例えば、Office 2007 以降の「開発者リボン」のように、
    タブページやサブメニューなどを用いて、分けてしまうのも手です。

    そうすれば、その管理者向けサブメニューを開けない一般ユーザーの目から、機能名を隠せます。
    メニューを分けることで、呼び出すまでのクリック数が増えることになるのが難点ですが。



    > Visubleで管理すると、権限がないボタンが消えて、見た目が穴ぼこみたいになりそう
    > ということで、後は設計方針の部分になってくるかと思うので、検討をしてみます。

    関連性のあるボタンなら、まとまって配置されていた方が使いやすい面もありますので、
    必ずしも単純に均等配置すれば良いというもので無いのが、デザインの難しいところですね。

    また、「機能」をアイコンや文字ではなく、『位置』で覚える人もいるので、
    歯抜けな配置になったとしても、位置を大きく変えないほうが良い場合もあります。
    (もちろん、その逆もありえるのですが)


    異なる権限のアカウントでログインする必要が生じる運用形態がありえる場合、
    権限によってボタンの位置が変わってしまうことに、使いにくさを覚えるかもしれません。
    たとえば「休職者に対する代行処理」とか「他店舗の臨時支援」などといったケースです。


    似たような話は、Microsoft Office のメニューでも起きていました。
    バージョン 2000 あたりから、「利用頻度の低いメニュー項目が自動的に非表示となる」機能が
    追加されたのですが、人によってはこれを邪魔に感じることがあったようです。

    もちろん、使わない機能は見えない方が分かりやすい、という考えの人もいるので、オプション設定で
     「最近使用したコマンドを最初に表示する」(Office 2000)
     「常にすべてのメニューを表示する」(Office 2002/2003)
    を切り替えられるようにはなっていましたけれどね。
記事No.86386 のレス / END /過去ログ148より / 関連記事表示
削除チェック/

■86426  Re[6]: Listを使ったクラスへのアクセスについて
□投稿者/ MTK -(2018/01/26(Fri) 20:47:32)
    No86416 (魔界の仮面弁士 さん) に返信

    色々な意見を頂きありがとうございます!


    > 非英語圏の単語を並べる場合はさておき、
    > 「英単語」を並べる場合には、英語の語順が良いと個人的には思います。
    >
    > ただ重要なのはむしろ、プロジェクト全体で統一の取れた命名規約を保つことですね。

    まだ命名に慣れていませんが、
    そのように統一していきたいと思います。



    > Visuble ではなく Visible ですね。

    ほんとですね;;
    失礼しました。



    > ボタンから呼び出される個別の処理を定義する場合は、ボタンクラスへの実装ではなく、
    > ボタンのインスタンスに対してイベントを割り当てて実装するようにし、
    > ボタンそのものの汎用的な振る舞いを定義する場合(長押しとかトリプルクリックとか)は、
    > ボタンクラスへの実装にすることが多いです、私は。

    だんだん、フォームのボタン側で出来ることが分かってきました。
    ボタンクラス側であれば長押しとかトリプルクリックとかも検出できるんですね。
    まだまだ勉強が必要です。



    > 特定のユーザーしか使わない機能は、例えば、Office 2007 以降の「開発者リボン」のように、
    > タブページやサブメニューなどを用いて、分けてしまうのも手です。

    なるほど、そういう発想は無かったですね。
    例えばボタンをグループ毎にタブコントロールで分けて、
    管理者メニューを1つのタブにまとめてしまうのはアリですね。



    > また、「機能」をアイコンや文字ではなく、『位置』で覚える人もいるので、
    > 歯抜けな配置になったとしても、位置を大きく変えないほうが良い場合もあります。
    > (もちろん、その逆もありえるのですが)

    考えてみたら、私も色々なものを位置で覚えているな・・・と思います。
    位置を変えない方がいい気がしますね。



    > 関連性のあるボタンなら、まとまって配置されていた方が使いやすい面もありますので、
    > 必ずしも単純に均等配置すれば良いというもので無いのが、デザインの難しいところですね。

    そうですよね;;
    その辺りのデザインセンスというか、配置配色のセンスなどが欠けていていつも困ってしまいます。
    特にユーザ視点での使いやすさ、分かりやすさを実現するのが難しく感じます。
    普段何気なく使っているソフトなどから、そういうものを吸収していかなければいけませんね。
記事No.86386 のレス / END /過去ログ148より / 関連記事表示
削除チェック/

■86587  Re[21]: ChartのX軸のタイトル表示
□投稿者/ mako -(2018/02/18(Sun) 14:33:27)
    No86586 (shu さん) に返信
    
    お世話になります。
    
    教えて頂いたようにしたとは思うのですが・・、
    
    今回は棒グラフの棒もタイトルの表示のあるとこにしか立たなくなりました。
    
    それと、例えばDim intr = 30 での場合の表示はタイトルと棒グラフの棒ともに
    08:30 空白 空白 10:20 10:50 11:20 11:50 12:20 12:50 13:20 12:50 となり、
    当初ように 8:10 8:30 空白 空白 10:20 10:30 11:00 11:30 12:00 12:30 13:00 13:30 とはなりませんでした。
    
    また、同じく Dim intr = 60 での場合はタイトルと棒グラフの棒ともに
    空白 空白 10:20 11:20 12:20 13:20 となり
    8:10 空白 空白 10:20 11:00 12:00 13:00 とはなりませんでした。
    
    タイトルの表示時間は時計での区切りの良い時間です。
    15分ですと00分 15分 30分 45分 00分・・、 30分ですと 00分 30分 00分・・ のようにです。
記事No.86333 のレス /過去ログ148より / 関連記事表示
削除チェック/

■86724  Re[1]: IO.streamreaderについて
□投稿者/ ussvoyager -(2018/03/03(Sat) 18:47:50)
    No86723 (ussvoyager さん) に返信
    > こんにちは
    >
    > 業務を改善できるかなと、簡単なソフト作成に取り組んでいます。
    > 下記のようなテキストファイルを読み取るルーチンなのですが、新規購入したノートPCの1台だけ
    > 「System.IO.FileNotFoundException: 'ファイル 'c:\test\hoge.txt' が見つかりませんでした。'」
    > で止まってしまいます。
    >
    > Dim buf As New System.IO.StreamReader("C:\test\hoge.txt")
    > Dim s As String = buf.ReadToEnd()
    > buf.Close()
    >
    > 他2台のデスクトップPCでは正常に読み取れます。
    > いずれもOSはwindows10 pro です。
    > もちろんテキストファイルを指定のパスに置き、ファイル名に不備はありません。変な半角スペースが無いことも何度も確認しています。
    > どうか宜しくお願いいたします。
    >
    >
記事No.86723 のレス / END /過去ログ149より / 関連記事表示
削除チェック/

■87036  Re[3]: WEBページの数式のコピーについて
□投稿者/ WebSurfer -(2018/04/08(Sun) 12:58:27)
    No87017 (くま1 さん) に返信

    > 例えば:
    > <<三角関数の公式の一覧>> Wikipedia
    > https://ja.wikipedia.org/wiki/%E4%B8%89%E8%A7%92%E9%96%A2%E6%95%B0%E3%81%AE%E5%85%AC%E5%BC%8F%E3%81%AE%E4%B8%80%E8%A6%A7
    > 中の三角関数公式 などなど。
    > 要は「画像」としての数式以外は全部ペーストできないですね。

    クリップボードや MS Word の仕様的なものは自分は全然分かりませんので、自分の環境 Windows 10,
    MS Word 2007 で試した結果から考えると、svg 画像はコピペできないようです。

    例えば、提示されている Wikipedia のページの「三角関数」のセクションで出てくる最初の数式、

    tan θ = sin θ/ cos θ

    は img 要素を使って画像が表示されています。html ソースでは以下のようになっています(IE11 の
    場合です。ブラウザによって若干異なりますが、肝心の src 属性は同じ)

    <img class="mwe-math-fallback-image-inline" aria-hidden="true"
    style="width: 13.36ex; height: 5.5ex; vertical-align: -2ex;"
    alt="{\displaystyle \tan \theta ={\frac {\sin \theta }{\cos \theta }}}"
    src="https://wikimedia.org/api/rest_v1/media/math/render/svg/6c1226e1d3fcd47c7692602e6cbd7769db4296fe">

    その src 属性の url からダウンロードされるのは svg 画像で、それがブラウザ上に表示されます。

    その svg 画像は MS Word 2007 にはコピペできなかったです。(そもそも、MS Word では svg 画像
    は表示できないようです。ググってみるとウラワザ的な方法はあるようですが・・・)

    解決策は、その svg 画像を png 形式に変換して MS Word に貼り付けることでしょうか。

    IE11 でその画像を右クリックして自分の PC のフォルダに保存すると png 形式になりますが(Chrome,
    Firefox では svg のまま)、その保存した png ファイルを MS Word 上の画像の場所にコピペすれば
    表示されます。

    枚数が多い場合は現実的は方法ではないとは思いますが。
記事No.86928 のレス /過去ログ149より / 関連記事表示
削除チェック/

■87303  エクセルのセルフォーマットの一括取得、設定
□投稿者/ Mu -(2018/05/09(Wed) 09:19:10)

    分類:[C#] 

    Vs2015 C# Win7 32bit Office2007〜

    お世話になります。

    エクセルのセルの書式(文字色、背景色、イタリック等)の情報を2次元配列で一括取得、設定する方法はない
    のでしょうか。
    値以外については、1セルずつ参照するしかないのでしょうか。

    よろしくお願いします。
親記事 /過去ログ150より / 関連記事表示
削除チェック/

■88613  Re[8]: フォルダ名とその更新日時を一緒に収得
□投稿者/ 魔界の仮面弁士 -(2018/09/10(Mon) 23:42:40)
    No88608 (なつ さん) に返信
    > 既に頭の中は混乱状態、思ってたよりは随分とややっこしいのですね。

    No88585 の時点で、DirectoryInfo にどういうメンバーが含まれているかは調査済みで、
    それでも調査しきれなかったという点についても、追加質問に対して、短いコード例を
    つけて回答したので、それで分かってもらえるものと思い込んでいました。反省。


    DirectoryInfo にどんなメンバーがあるかは、DataGridView に渡すことで一覧できます。
    DirectoryInfo のプロパティに、日付情報も同時に記録されていることが一望できるかと。

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
      Dim sDir As String = "C:\Users\○○○\○○○\SONY NNC\SNNC30"
      DataGridView1.DataSource = New DirectoryInfo(sDir).GetDirectories("*", SearchOption.AllDirectories)
    End Sub


    上記では、コントロールに表示するために GetDirectories を使いましたが、
    No88598 でも述べたように、 EnumerateDirectories を使って LINQ や For Each での
    順次列挙を行うこともできます。


    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
     Dim sDir As String = "C:\Users\○○○\○○○\SONY NNC\SNNC30"
     For Each di In New DirectoryInfo("C:\TEST").EnumerateDirectories("*", SearchOption.AllDirectories)
       Debug.WriteLine($"作成={di.CreationTime}, 更新={di.LastWriteTime}, パス={di.FullName}")
     Next
    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
     Dim sDir As String = "C:\Users\○○○\○○○\SONY NNC\SNNC30"
     For Each di In New DirectoryInfo("C:\TEST").GetDirectories("*", SearchOption.AllDirectories)
       Debug.WriteLine($"作成={di.CreationTime}, 更新={di.LastWriteTime}, パス={di.FullName}")
     Next
    End Sub

    Button2 は EnumerateDirectories による列挙、
    Button3 は GetDirectories による列挙にしてあります。

    いずれも Debug.WriteLine により、「イミディエイト」ウィンドウもしくは「出力」ウィンドウに
    作成日時、更新日時、ディレクトリ名を列挙するだけの処理です。


    sDir に、フォルダ数が多いパスを与えてみてください。
    EnumerateDirectories ではすぐに列挙が始まるのに、
    GetDirectories では列挙開始まで時間がかかってしまいます。


    また、sDir に "C:\Windows" などを与えると、アクセス権の問題から
    例外で停止してしまうことになります。これが No88598 で述べていた注意点です。
    >> UnauthorizedAccessException 例外等により、処理が中断されてしまうことになります。



    > Dim x As IEnumerable(Of String) = System.IO.Directory.EnumerateDirectories("C:\Users\○○○\○○○\SONY NNC\SNNC30", "*", System.IO.SearchOption.AllDirectories)
    > ただ疑問なのは、x は 同じString でありながらも、
    同じ…では無いですよね?
    x の型は「String」でも「String()」でもなく、「IEnumerable(Of String)」なのですから。



    > 何故か ListBox1.Items.AddRange(x) とは出来ないのかです。
    AddRange メソッドの引数に渡せる型は「Object()」だからですね。
    (Hongliang さんの回答にあるとおり、もう一つのオーバーロードもありますが)

    でもって、IEnumerable(Of String) は一次元配列ではありませんから、
    Object() に変換することができません。ゆえに、AddRange には渡せないということです。


    配列化するために『ListBox1.Items.AddRange(x.ToArray())』のように呼べば渡せますが、
    それなら最初から、EnumerateDirectories ではなく GetDirectories を使えば済みますね。


    ただし LINQ で再加工するような処理においては、EnumerateDirectories の方が良いでしょう。


    Dim q = From di In New DirectoryInfo(sDir).EnumerateDirectories("*", SearchOption.AllDirectories)
        Select $"作成={di.CreationTime}, 更新={di.LastWriteTime}, パス={di.FullName}"

    ListBox1.Items.AddRange(q.ToArray())



    > NET Framework は4.0のようです。
    NET ではなく .NET (ドットネット) ですね。

    Jitta さんの回答に補足して、.NET Framework のライフサイクルの表を載せておきます。
    (.NET Framework 4 / 4.5 / 4.5.1 のサポートは、2016 年 1 月 12 日で終了しています)


    4.7.2 → 2018/02/05 ライフサイクル開始、サポート中(OS のサポート期限まで)★現在の最新版★
    4.7.1 → 2017/10/17 ライフサイクル開始、サポート中(OS のサポート期限まで)
    4.7  → 2017/04/05 ライフサイクル開始、サポート中(OS のサポート期限まで)
    4.6.2 → 2016/08/02 ライフサイクル開始、サポート中(OS のサポート期限まで)
    4.6.1 → 2015/11/30 ライフサイクル開始、サポート中(OS のサポート期限まで)
    4.6  → 2015/07/20 ライフサイクル開始、サポート中(OS のサポート期限まで)
    4.5.2 → 2014/05/05 ライフサイクル開始、サポート中(OS のサポート期限まで)
    4.5.1 → 2013/09/07 ライフサイクル開始、2016/01/12 で既にサポート切れ
    4.5  → 2012/08/05 ライフサイクル開始、2016/01/12 で既にサポート切れ
    4.0  → 2010/03/31 ライフサイクル開始、2012/03/04 Update 3(4.0.3)、2016/01/12 で既にサポート切れ
    3.5  → 2007/11/19 ライフサイクル開始、2008/11/18 Service Pack 1(3.5.1)、サポート中(OS のサポート期限まで)
    3.0  → 2006/11/19 ライフサイクル開始、2008/08/12 Service Pack 2、2011/07/12 で既にサポート切れ
    2.0  → 2005/11/07 ライフサイクル開始、2009/01/16 Service Pack 2、2011/07/12 で既にサポート切れ
    1.1  → 2003/04/01 ライフサイクル開始、2004/09/09 Service Pack 1、2013/10/08 で既にサポート切れ
    1.0  → 2002/01/05 ライフサイクル開始、2004/09/09 Service Pack 3、2009/07/14 で既にサポート切れ

    ※ライフサイクルの開始日は、リリース日とは異なります。


    4.7.2 を同梱している OS → Windows 10 ver1803
    4.7.1 を同梱している OS → Windows 10 ver1709
    4.7  を同梱している OS → Windows 10 ver1703
    4.6.2 を同梱している OS → Windows 10 ver1607
    4.6.1 を同梱している OS → Windows 10 ver1511
    4.6  を同梱している OS → Windows 10 ver1507
    4.5.2 を同梱している OS → なし
    4.5.1 を同梱している OS → Windows 8.1
    4.5  を同梱している OS → Windows 8
    4.0  を同梱している OS → なし
    3.5.x を同梱している OS → Vista 〜 Windows 10
    3.0  を同梱している OS → Vista 〜 Windows 10
    2.0  を同梱している OS → Vista 〜 Windows 10
    1.1  を同梱している OS → なし
    1.0  を同梱している OS → なし
記事No.88574 のレス /過去ログ152より / 関連記事表示
削除チェック/

■88988  Re[1]: C#のデータベース接続について
□投稿者/ 魔界の仮面弁士 -(2018/10/24(Wed) 09:17:14)
    No88987 (テトリス さん) に返信
    > accdb形式のaccessのフォルダを紐づけたいと考えています。
    フォルダ……ですか? Access accdb の?

    フォルダー内に複数の(あるいは単一の) .accdb ファイルがあって、
    そのデータを読み書きしたい、という意味でしょうか。


    > VisitUser.accdb
    > ┗テーブル名:来客情報_T
    >   ┗フィールド:時刻
    >   ┗フィールド:会社名
    >   ┗フィールド:氏名

    どの部分が分からないのかが分からないのですが、どのデータベースが相手でも、
    接続するプロバイダーと接続文字列が異なるだけで、基本的な読み書きの手順は
    同じなので、『ADO.NET』に関するチュートリアルを一通り試してみることをお奨めします。

    まずは手順にしたがって実装を進めていけば、やるべきことや不明瞭な点が
    明らかになってくるかと思います。


    WPF + Access 2016 + ADO.NET(OdbcConnection)
    https://water2litter.net/gin/?p=1424

    WPF + Access 2016 + ADO.NET(OleDbConnection)
    https://water2litter.net/gin/?p=1849

    WinForms + Access 2007 + ADO.NET(OleDbConnection)
    https://www.itlab51.com/?p=4417

    WinForms + Access .mdb/.accdb + ADO.NET(OleDbConnection)
    https://msdn.microsoft.com/ja-jp/library/ms171893.aspx
記事No.88987 のレス /過去ログ153より / 関連記事表示
削除チェック/

■89237  C#におけるプロシージャと引数
□投稿者/ 34 -(2018/11/12(Mon) 16:19:02)

    分類:[C#] 

    VB.NETからC#に変換作業をしている初心者です。

    public int Name(string ss2, string ss1)

    この場合、stringである引数ss2とss1をint型で返したいのですが、どうすれば良いでしょうか。
親記事 /過去ログ153より / 関連記事表示
削除チェック/

■89439  Re[4]: ストアアプリ版のEXCELをCreateObjectする方法
□投稿者/ Azulean -(2018/11/28(Wed) 22:34:20)
    2018/11/28(Wed) 23:42:04 編集(投稿者)

    No89438 (Azulean さん) に返信
    > // 注意:UWP 版 Office をインストールして観察したことがないので、間違っているかもしれません。

    実験環境にインストールして見たところ以下の点を確認できました。

    ・レジストリエディタで HKEY_CLASSES_ROOT に Excel で始まるキーは存在しない。
    ・Excel の UWP 版のインストール先 C:\Program Files\WindowsApps\Microsoft.Office.Desktop.Excel_16050.11029.20079.0_x86_8wekyb3d8bbwe に AppxManifest.xml があり、その中に COM の定義がある。

    一応、AppxManifest.xml の中には VersionIndependentProgId="Excel.Application" とあるので考慮はされていそうな感じはあります。

    -----
    私の認識としては COM 生成のいくつかの API がインストール済みの UWP に含まれる AppxManifest.xml を加味した振る舞いをしている。
    この結果、レジストリに登録がなくても COM オブジェクトは生成できる。
記事No.89420 のレス /過去ログ154より / 関連記事表示
削除チェック/

■89618  Re[7]: Excelオブジェクトに関して(VB6)
□投稿者/ 魔界の仮面弁士 -(2018/12/10(Mon) 14:13:11)
    2018/12/10(Mon) 14:40:24 編集(投稿者)

    No89616 (k3user さん) に返信
    >> また、Excel のバージョンは何でしょうか?
    > Excel 2012で確認を行っています。

    言葉足らずで済みません。
    知りたかったのはマイナーバージョンとか C2R / MSI の情報とかです。

    https://support.microsoft.com/ja-jp/help/2121559/
    https://docs.microsoft.com/en-us/officeupdates/update-history-office-2010-click-to-run

    「14.0.4760.1000 (32 ビット)」とか
    「14.0.5128.5000 (32 ビット)」とか
    「14.0.6123.5001 (32 ビット)」とか
    「14.0.7106.5003 (32 ビット)」とか


    No89591 の段階で 2010 & 14.0 と書かれていたので、メジャーバージョンは分かって
    いるつもり…・・・だった――のですが、今度は Excel 2012 になっていますね…?
    それだと Windows 版ではなく、Mac 版ということになってしまうのですが。


    > 調査のため以下の2の処理をすべてコメントアウト
    > してみたのですが、それでも通貨型に変換されてしまいます。
    > 1.Excelオープン
    > 2.データ取得&代入
    > 3.Excelクローズ

    取得も代入もせず、開いて閉じるだけ(上書き保存すらしない)ということでしょうか。
    それとも Save あるいは SaveAs は行うということでしょうか。

    環境依存の問題なのかどうか、再現性を確認したいので、
    手順 1 と 3 だけに単純化した「現象を再現可能なコード」を
    作成してもらえないでしょうか。



    No89615 (k3user さん) に返信
    > ファイル破損の可能性も考えられるため、全く新しいシートで
    > 試してみましたが、改善はされませんでした。

    新規シートではなく、新規ブックで試してみてください。
    (破損しているブックに新しいシートを追加しても、改善するとは限らないので)


    【追記】
    1 つ思い出しました。
    Workbook の SaveAs メソッドを呼び出す際に、
    Local 引数を明示してみてください。


    『Excelを操作(Excelファイルを開く、保存する、閉じる)するだけで表示形式が勝手に変わってしまう』
    https://social.msdn.microsoft.com/Forums/ja-JP/4e454fcc-93f8-4372-98ac-9a65fb3e38e3/excelexcel


    上記は、Excel 2013で Workbooks.Open / Save を実施して
    再度ファイルを開くと、表示形式が変わってしまうというもので、
    バージョンや使用メソッドが微妙に異なるのですが、
    現象としては酷似しているので、一応試してみる価値がありそうです。


    参考までに、上記 URL 事象の当時の検証バージョンを記載しておきます。

    - 再現しないことを確認
    ・ Office 2007 SP1、SP2、SP3
    ・ Office 2010 RTM、SP1、SP2
    - 再現することを確認
    ・ Office 2013 C2R (15.0.4711.1003)


    この現象は、Office 文書の保存時に、各国で統一形式とするために、
    VB6 等からの操作や VBA での動作時にのみ、Excel の内部ロケールが
    一時的に英語モードの切り替わって処理されるためだそうです。

    そのため、この問題が発生するバージョンの Excel では、
    意図的に Local 引数に True を指定して SaveAs することで
    英語への切り替えが抑制され、問題が回避されるのだとか。


    なお、SaveAs メソッドの「Local 引数」は 2002 以降で使用可能です。
    https://www.saka-en.com/office/vba-saveas-text-date-num/
記事No.89591 のレス /過去ログ154より / 関連記事表示
削除チェック/

■89786  Re[1]: buttonのドラッグリサイズ C#プログラム
□投稿者/ 魔界の仮面弁士 -(2018/12/26(Wed) 10:25:04)
    No89782 (Rty1143 さん) に返信
    > C# windows form application で button をフォーム上に配置しておりますが、
    > このbuttonの端をマウスで摘んでドラッグでリサイズする方法を調べています。
    > 分かる方いませんか?
    
    これでどうでしょう。Load イベントなどで
    
     private void Form1_Load(object sender, EventArgs e)
     {
      Resizer.Attach(button1);
      Resizer.Attach(button2);
      Resizer.Attach(button3);
     }
    
    のように呼ぶことで、ドラッガブルなコントロールになります。
    
    //-----
    using System;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using System.Drawing;
    
    public static class Resizer
    {
        public static void Attach(Control target)
        {
            Attach(target, 5);
        }
    
        public static void Attach(Control target, int bandWidth)
        {
            if (bandWidth <= 0) { throw new ArgumentOutOfRangeException(nameof(bandWidth), bandWidth, "1以上の値を指定してください。"); }
            target.MouseDown += (sender, e) =>
            {
                int cmd = GetResizeCommand(target.Size, e.Location, bandWidth);
                if (cmd != 0)
                {
                    SetCapture(target.Handle);
                    ReleaseCapture();
                    SendMessage(target.Handle, WM_SYSCOMMAND, SC_SIZE | cmd, 0);
                }
            };
            target.MouseMove += (sender, e) =>
            {
                switch (GetResizeCommand(target.Size, e.Location, bandWidth))
                {
                    case 1:
                    case 2:
                        target.Cursor = Cursors.SizeWE;
                        break;
                    case 3:
                    case 6:
                        target.Cursor = Cursors.SizeNS;
                        break;
                    case 4:
                    case 8:
                        target.Cursor = Cursors.SizeNWSE;
                        break;
                    case 5:
                    case 7:
                        target.Cursor = Cursors.SizeNESW;
                        break;
                    default:
                        target.Cursor = Cursors.Default;
                        break;
                }
            };
        }
    
        private static int GetResizeCommand(Size size, Point point, int bandWidth)
        {
            int WMSZ = 0;
            if (point.X < bandWidth) { WMSZ += 1; }
            if (point.Y < bandWidth) { WMSZ += 3; }
            if (size.Width - bandWidth < point.X) { WMSZ += 2; }
            if (size.Height - bandWidth < point.Y) { WMSZ += 6; }
            return WMSZ;
        }
    
        #region P/Invoke
        [DllImport("user32")]
        private static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, int lParam);
        [DllImport("user32")]
        private static extern bool SetCapture(IntPtr hWnd);
        [DllImport("user32")]
        private static extern bool ReleaseCapture();
        private const int WM_SYSCOMMAND = 0x0112;
        private const int SC_MOVE = 0xF010;
        private const int SC_SIZE = 0xF000;
        #endregion
    }
    
    //-----
    
    なお、上記のサンプル最低限のものなので、たとえば
     ・リサイズ可能な最小・最大サイズを設定できない
     ・同じコントロールに何度もアタッチできてしまう
     ・解除処理(デタッチ)を実装していない
    といった実装課題があります。
記事No.89782 のレス /過去ログ154より / 関連記事表示
削除チェック/

■89947  Re[5]: リッチテキストボックスでカラー情報をコピーする方法
□投稿者/ 魔界の仮面弁士 -(2019/01/23(Wed) 10:52:43)
    2019/01/23(Wed) 12:01:15 編集(投稿者)

    No89928 (イエメン さん) に返信
    > どうすればカラーなどの情報も同時に貼り付けることができますか?

    (案1)Excel からコピーした内容を Word に貼り、それを再コピーして RichTextBox に貼る

    (案2)Excel の書式情報(Biff12 等)を解析して Rtf 書式に再構築するコードを自力実装する

    (案3)Excel オートメーションで、一文字ずつ書式情報を読み取って処理していく
     http://hanatyan.sakura.ne.jp/vbhlp/Excel13.htm

    (案4)有償/無償の RTF コンバーターを探してきて利用する
     https://www.sautinsoft.com/convert-excel-xls-to-pdf/xlsx-to-rtf-dotnet-csharp.php
     https://convertio.co/ja/xlsx-rtf/



    No89940 (Azulean さん) に返信
    > Excel 2010 をコピー元として様子を見る限り、形式を選択して貼り付けで「リッチテキスト形式」を選んでも色がつかない

    こんな情報もあったので、Excel のバージョンを上げれば
    マシになるかな…と思いきや、やっぱり駄目でした。無念。

    『Excel 2016 でリッチ テキストを使用すると、文字書式設定が失われる』
    「この問題は、バージョン 1708 (8431.2109) で修正されています。」
    https://support.office.com/ja-jp/article/e0536ed1-b339-45fa-b665-917fe165d957


    とりあえず、手持ちの Excel 2016 ver1812 でコピー操作を行ってみて、
    その時にクリップボードに送られる形式を調べてみました。
    先頭の○×は、RichTextBox に貼ることができるかどうかを示したものです。


    クリップボード内容の確認には、フリーソフトの「クリップ見え窓」を利用しました。



    《色情報を含むが、OLE 埋め込みや OLE リンクになるもの》
    ○ "Embed Source" ※ 貼り付け後にダブルクリックすると編集用の Excel が起動する
    ○ "Link Source" ※ コピー元の Excel ファイルを編集すると RichTextBox 側も自動で書き換わる


    《色情報を含むが、画像形式となってしまうもの》
    △ "EnhancedMetafile" (CF_ENHMETAFILE = 14) ※ 拡張メタファイル形式。
    ○ "MetfaFilePict" (CF_METAFILEPICT = 3) ※ メタファイル形式。
    × "Bitmap" (CF_BITMAP = 2) ※ ビットマップ形式。System.Drawing.Bitmap として得られた。


    《色情報を含められる形式だが、色情報が記録されていなかった物》
    ○ "Rich Text Format"


    《色情報を含む形式で、色情報が記録されていた物》
    × "SymblicLink" (CF_SYLK = 4) ※ Microsoft SYLK 形式。
    × "Biff12" ※ Excel 2007 形式。
    × "Biff8" ※ Excel 97〜2003 形式。
    × "Biff5" ※ Excel 95 形式。
    × "XML Spreadsheet" ※ Office XML 形式。
    × "HTML Format" ※ HTML 形式。


    《そもそも色情報を含まない形式の物》
    × "DataInterchangeFormat" (CF_DIF = 5) ※ VisiCalc 形式。
    ○ "UnicodeText" (CF_UNICODETEXT = 13) ※ UTF-16 なタブ区切りテキスト。
    ○ "Text" (CF_TEXT = 1) ※ 既定のコードページによるタブ区切りテキスト。
    × "Csv" ※ ANSI コードページによるカンマ区切りテキスト。


    《その他の形式》
    × "DataObject"
    × "Hyperlink"
    × "Object Descriptor"
    × "Link Source Descriptor"
    × "Link"
記事No.89928 のレス /過去ログ155より / 関連記事表示
削除チェック/

■90511  Re[6]: AddHandler Eventの別スレッドについて
□投稿者/ 魔界の仮面弁士 -(2019/03/15(Fri) 11:55:19)
    2019/03/15(Fri) 12:07:39 編集(投稿者)

    解決済みで閉じられているので、いちおうチェックは付けた状態に戻しておきます。


    No90477 (TanuTanu さん) に返信
    > その結果、yahooButton = DirectCast(doc.all.item("yahoo"), mshtml.IHTMLElement)の行にて下記エラーが発生致しました。

    その行のどの部分に問題があるのかを確認してみてください。

    NullReferenceException とは、インスタンスが空の時、すなわち
    オブジェクトが Nothing である場合に、
    そのメンバーを操作しようとして発生する例外ですよね。


    If doc Is Nothing Then
     MsgBox("doc が空だった")
    ElseIf doc.all Is Nothing Then
     MsgBox("doc.all が空だった")
    ElseIf doc.all.item("yahoo") Is Nothing Then
     MsgBox("doc.all.item(""yahoo"") が空だった")
    Else
     MsgBox("いずれも空ではなさそう")
     yahooButton = DirectCast(doc.all.item("yahoo"), mshtml.IHTMLElement)
    End If




    > FindWindowExWの値は0ですが、FindWindowではハンドル値取得できました。
    > PWnd1 = FindWindowExW(IntPtr.Zero, IntPtr.Zero, "TabThumbnailWindow", "JavaScript テスト - Internet Explorer")

    示されているのが結果だけで、要因となりうる情報が隠されたままなので、修正すべき箇所を指摘できないです。(^^;

    あえてもう一度質問させていただきます。
    『その API (FindWindowEx および FindWindowExW) の宣言部はどうなっていますか?』( No90475 の再掲 )


    少なくとも当方では、下記の API 宣言で取得できています。

    ' Imports System.Runtime.InteropServices

    ' === 案1 ===
    <DllImport("user32", CharSet:=CharSet.Unicode, SetLastError:=True)>
    Private Shared Function FindWindowExW(hwndParent As IntPtr, hwndChildAfter As IntPtr, lpszClass As String, lpszWindow As String) As IntPtr
    End Function

    ' === 案2 ===
    <DllImport("user32", CharSet:=CharSet.Auto, SetLastError:=True)>
    Private Shared Function FindWindowEx(hwndParent As IntPtr, hwndChildAfter As IntPtr, lpszClass As String, lpszWindow As String) As IntPtr
    End Function

    ' === 案3 ===
    Private Declare Unicode Function FindWindowExW Lib "user32" (hwndParent As IntPtr, hwndChildAfter As IntPtr, <MarshalAs(UnmanagedType.LPTStr)> lpszClass As String, <MarshalAs(UnmanagedType.LPTStr)> lpszWindow As String) As IntPtr

    ' === 案4 ===
    Private Declare Auto Function FindWindowEx Lib "user32" (hwndParent As IntPtr, hwndChildAfter As IntPtr, <MarshalAs(UnmanagedType.LPTStr)> lpszClass As String, <MarshalAs(UnmanagedType.LPTStr)> lpszWindow As String) As IntPtr




    宣言が間違っていて、IntPtr.Zero が返却されてしまうパターン。

    ' === 没1 ===
    <DllImport("user32", EntryPoint:="FindWindowExW", SetLastError:=True)>
    Private Shared Function FindWindowEx(hwndParent As IntPtr, hwndChildAfter As IntPtr, lpszClass As String, lpszWindow As String) As IntPtr
    End Function

    ' === 没2 ===
    <DllImport("user32", SetLastError:=True)>
    Private Shared Function FindWindowExW(hwndParent As IntPtr, hwndChildAfter As IntPtr, lpszClass As String, lpszWindow As String) As IntPtr
    End Function

    ' === 没3 ===
    Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExW" (hwndParent As IntPtr, hwndChildAfter As IntPtr, lpszClass As String, lpszWindow As String) As IntPtr



    正しい宣言ではないが、一応呼び出せてしまうパターン。

    ' === 非推奨1 ===
    Private Declare Unicode Function FindWindowExW Lib "user32" (hwndParent As IntPtr, hwndChildAfter As IntPtr, lpszClass As String, lpszWindow As String) As IntPtr

    ' === 非推奨2 ===
    Private Declare Unicode Function FindWindowEx Lib "user32" Alias "FindWindowExW" (hwndParent As IntPtr, hwndChildAfter As IntPtr, lpszClass As String, lpszWindow As String) As IntPtr



    >  WEBページ・・・CreateObject("Shell.Application").Windowsで対応しております。
    これを用いている部分のコードも見せていただけないでしょうか。

    SHDocVw.ShellWindows を宣言しておきながら、FindWindowEx API や、GetIEDocument までも
    追加で呼び出している理由が、どうしても分からなかったのです。

    No90463 の発言より、「objIE.LocationName」を利用しているであろうことは推察できましたが、
    目的は LocationName プロパティでウィンドウのタイトルを得ることだけなのでしょうか。
    あるいは HWND プロパティからウィンドウハンドルも得ているとか?

    objIE.Document プロパティを通じて HTMLDocument を得ることができるはずなので、
    わざわざ GetIEDocument を呼び出す必要性は無いと思っています。( No90469 で指摘 )

    (例)
    http://jumbofoot.cocolog-nifty.com/yass_vbnet_tips/2007/02/shellhtmldocume_f1cd.html


    WM_HTML_GETOBJECT でないと取得できない相手の場合は、API 宣言が必要になりますが、
    その場合、今度は CreateObject("Shell.Application").Window を使う意味が分からない…。



    >  上記WEBページから派生したWEBページダイアログ ・・・ GetIEDocument で対応(現在、ここのボタンクリックのイベントを対応しております。)

    ここでいう『派生』とは何を示していますか? ページ遷移の事でしょうか?

    ページが遷移したのであれば、以前の HTMLDocument はもう使えないので、
    読み込みが完了したことを通知するための DocumentComplete イベントにて、
    イベント引数 pDisp の Document プロパティを受け取るようにします。
    (フレームを持つページの場合は、各フレームごとに発生することに注意)

    あるいは、ターゲットとなる InternetExplorer オブジェクト(IWebBrowser2)を保持しておいて、
    その Document プロパティを取得しなおすという方法も使えますが、いずれにせよ、
    読み込みが完了する前に GetIEDocument なり Document プロパティなりで
    HTMLDocument を得ていた場合、DOM が不完全な状態になっていることがあります。

    なので、取得した HTMLDocument が、目的のページの内容を指しているかを
    確認しておくことも重要です。(これも No90469 で指摘 )


    それに、FindWindowEx を使うにしても、その使い方が不自然に思えます。
    そもそも "TabThumbnailWindow" クラスを探している理由は何でしょうか?
    先の GetIEDocument を使うことが目的なら、探すべきウィンドウは
    "Internet Explorer_Server" クラスのウィンドウ(またはその親ウィンドウ)の
    ハンドルであるはずですよね。


    また、「WEBページダイアログ」とは何を指していますか?
    キャプションが "JavaScript テスト - Internet Explorer" となる、 No90454
    https://www.javadrive.jp/javascript/event/sample2_1.html だとすれば、
    そもそもダイアログは存在していません。
    別のページが対象なのかもしれませんが、その場合は、doc.all.item("yahoo") は存在しないかもしれませんし。

    No90476 では「javascriptによる擬似モーダルダイアログ『だと思う』」とお答えいただきましたが、
    それが具体的になんであるのか(たとえば jQuery の colorbox とか)や、
    イベント割り当てが onclick なのかそれ以外なのかもはっきりしないままです。
記事No.90434 のレス / END /過去ログ156より / 関連記事表示
削除チェック/

■89538  Re[1]: 回答者の心得について
□投稿者/ &#129296; -(2018/12/03(Mon) 02:46:50)
    管理人によって考え方も違ってて統一も取れてないし、
    今のとこは統一とかせず、各自が過去ログ眺めてから
    多数派と思えた方に合わせていくスタンスでいいんじゃない?

    んでも、指摘だけの投稿が駄目ってのは共通見解にしたい。


    【2005/08/03 09:19:02】じゃんぬ さん / Re[2]: スレッドからのTextBoxスクロール
    http://bbs.wankuma.com/index.cgi?mode=red&namber=959&KLOG=1
    >
    > 勝手な申し出かもしれませんが、解決方法を書いて頂けませんか?
    > というのも、同じ悩みを持った方が、ここを訪れた時に解決のヒントになると思うからです。
    > 掲示板はサポートセンタではなく、善意のコミュニティですので、
    > 質問者も回答者も、インターネットリソースの供給をしていきたいと願っています。
    >



    【2007/03/06 11:57:26】じゃんぬねっと さん / Re[1]: 解決済みチェックの維持
    http://bbs.wankuma.com/index.cgi?mode=red&namber=1788&KLOG=10
    >
    >> この掲示板では、「解決済み」チェックがついた後、そのツリーにレスを付ける際に「解決済み」をつけないと、トピック一覧で見た時に未解決に見えてしまいます。
    >> レスを付ける際に、既に解決済みのツリーはチェックを外せないとか、デフォルトでチェックがついてるといったようにすることは可能でしょうか?
    >
    > そのように実装してしまえば、当然可能ではあります。
    >
    > Perl 自体は難しくないのですが、元のソースが結構 (いろんな意味で) すごいので、
    > あまり手をつけたくないというのもありますが、チェックが付いたままになるように改善を考えておきます。
    >
    > # その前に、正式なフォーラムをアップしてしまえば良いような気がします。(ここは、そもそも一時的な掲示板ですので)
    >


    【2008/02/06 21:45:00】中博俊 さん / Re[9]: 質問者と回答者のマナーについて
    http://bbs.wankuma.com/index.cgi?mode=red&namber=13935&KLOG=29
    >
    > この件について管理人内での意思統一の議論は行っていませんのでオフィシャルコメントではありません。(そう遠くはない意見だとは思いますが)
    > この掲示板は管理人が二人いるため管理人と指す場合には、不肖中博俊、もしくはじゃんぬねっとを指します。
    >
    > ・そもそもルールを守らない人のためのルールは守られない。
    > ・10行以上あるルールなんて誰も読みはしない
    > ・すべての判断(削除など)については管理人の責任で実施する
    >
    > これらが前提になります。
    > 結果的に常連組に対するルールは検討しても、一般ユーザについてのルールなどを設けるつもりはあまりありません。
    >
    > ・勝手にルールを決めて押しつけない
    > ・炎上させない
    > ・法に違反することはしない
    > ・公序良俗に反することはしない
    > ・マルチポストが悪いかどうかの指摘はしない(ブリッジ推奨です)
    > ・報告を求めない
    >
    > おそらくこのようなルールであれば策定するでしょう。
    >



    【2008/02/06 21:46:18】中博俊 さん / Re[10]: 質問者と回答者のマナーについて
    http://bbs.wankuma.com/index.cgi?mode=red&namber=13936&KLOG=29
    >
    > ちなみに解決済みマークも私は嫌いです。
    > どうせだれもチェックしないものなんておいても仕方がないとの考えからです。
    >
    > これについてはじゃんぬねっとと考え方が違ったはず・・・
    >



    【2008/10/28 10:48:45】中 博俊 さん / Re[12]: String型へのキャスト
    http://bbs.wankuma.com/index.cgi?mode=red&namber=27107&KLOG=49
    >
    >>・質問者が解決済みを忘れる → 指摘する これはOK?
    >>・質問者以外が解決済みを忘れる → 指摘する これはNG?
    > どちらもNGです。
    >
    > P.S.これで解決できたら解決済みでも押しといてくださいな〜
    >
    > これはOKです。
    > 指摘だけの投稿は勘弁してください。特に常連の方。
    > 常連は自重を求められるそういう掲示板です。
    >
記事No.89528 のレス /過去ログ156より / 関連記事表示
削除チェック/

■91529  Re[3]: メモリリークに関して
□投稿者/ 魔界の仮面弁士 -(2019/07/03(Wed) 19:14:23)
    No91518 (kiku さん) に返信
    >> For i = 0 To controlCollection.Count - 1
    >>  Dim control As Control = controlCollection(i)
    >>  control.Parent = Nothing
    >>  control.Dispose()
    >> Next
    >> .NET Compact Framework の実装については、上記に相当する処理を見つけることができませんでした。
    > なんと、これが直接的な原因みたいですね。

    Control.Dispose が上記を実装していれば、
    Form1 が Dispose される時に、Controls が再帰的に列挙され、
    Panel や Label といった子(あるいは子孫)コントロールも
    連動して解放されるはずなのですけれどね。


    とはいえ、GC 管理の仕組みがそもそも異なるので、
    .NET Framework 版との単純な比較はできません。
    (ソースコードは非公開ですし、逆アセンブルはライセンス上禁じられている…)

    実際 CE においても、親 Form が Dispose されれば、その配下のコントロール群も
    Dispose されることを確認できました。
    とはいえ、子コントロールの Dispose が確実に呼ばれているのか、
    たまたま GC されただけなのかまでは分かりません。

    一応、Dispose(False)時は、ApplicationThreadContext のファイナライズキューへの
    登録っぽい処理が行われると聞いたことがありますが、詳しいことは分からないです。


    CE 環境は Application.OpenForms でキャッシュされることが無いとは言え、
     (1) VB 特有の「My.Forms.フォーム名」プロパティでキャッシュされることはある
     (2) Form 右上の×を押しても Minimize されるだけ(Close/Dispose されるとは限らない)
    ということで、Dispose が呼ばれにくい状況に陥りやすそうではありますね。



    あと、経験則的なところで言えば、.NET Compact Framework 環境の場合、
    オブジェクトの使用後は、参照変数に Nothing 代入を積極的に行った方が良いみたいです。


    [宇宙仮面の研究室] - [Compact Framework のメモリ管理]
    https://uchukamen.wordpress.com/2007/01/23/compact-framework-%e3%81%ae%e3%83%a1%e3%83%a2%e3%83%aa%e7%ae%a1%e7%90%86/

    [SWK623] - [[.NET] WindowsMobile上のC#アプリのメモリリークを解決せよ!]
    https://swk623.com/2009/03/16/net-windowsmobile%E4%B8%8A%E3%81%AEc%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%AF%E3%82%92%E8%A7%A3%E6%B1%BA%E3%81%9B%E3%82%88%EF%BC%81/

    [スラド] - [#1411305]
    https://srad.jp/comment/1411305


    基本的には、変数のスコープを抜ければ GC 対象にはなりそうですが、
    Module / Shared 等で保持されたインスタンスや、
    メインフォームのフィールド変数がもつ参照の場合は、
    変数の寿命が長くなるので、自分で管理するしか無さそう。
記事No.91509 のレス /過去ログ158より / 関連記事表示
削除チェック/

■91626  Acrobat Readerを自動的に閉じる方法
□投稿者/ ペコ犬 -(2019/07/16(Tue) 12:34:15)

    分類:[VB.NET/VB2005 以降] 

    VB.NetよりPDFを印刷するプログラムを作成しています。
    PDFはプリンタに印刷されるのですが、
    Acrobat Readerが最小化されてタスクに表示されてしまいます。
    自動的にAcrobatを閉じたいのですが、何か良い方法はありますか?
    以下、ソースです。


    -----------------------------------------------------------------
    Private Sub Test()
    Dim p As New System.Diagnostics.Process()
    Dim fileNm As String = String.Empty

    'PDFファイルのパスを設定
    fileNm = "C:\Test\test1.pdf"
    p.StartInfo.FileName = fileNm
    p.StartInfo.Verb = "print"

    'Acrobatのコマンドライン引数設定
    p.StartInfo.Arguments = "/s /l /p /h"
    p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    'プロセスを新しいWindowで起動
    p.StartInfo.CreateNoWindow = True

    'プロセス起動
    p.Start()
    p.WaitForExit()
    End Sub
    -----------------------------------------------------------------


    ※Argumentsに問題があるのでは?と思い、参考になりそうなURLも見つけましたが、
     上手くいきませんでした。
     
     http://scripting.cocolog-nifty.com/blog/2007/07/adobe_reader_81_e41e.html
親記事 /過去ログ158より / 関連記事表示
削除チェック/

■91933  Re[14]: C++からVBへの変換
□投稿者/ 魔界の仮面弁士 -(2019/08/10(Sat) 16:23:56)
    2019/08/10(Sat) 16:26:50 編集(投稿者)

    No91932 (774RR さん) に返信
    > FFT なんぞテキトーに探せばいくらでもライブラリが転がっているような気のせいがする。

    この辺にありそうな気がします。確認はしていませんけど。
    https://www.nuget.org/packages?q=fft

    VB.NET に移植済みの実装が欲しいという話なら、こんなのもあります。
    http://numeric.world.coocan.jp/computer/vb/mathpack.htm

    Excel VBA でも良ければこんなのもありました。
    関数化はされていないものの、再帰処理を用いないフラットな実装。
    http://tsuyu.cocolog-nifty.com/blog/2007/03/publi.html


    真面目に再実装する気があるなら、複素数構造体を併用すると良いかもしれません。
    https://docs.microsoft.com/ja-jp/dotnet/api/system.numerics.complex.frompolarcoordinates

    複素数構造体を用いた実装例は下記にありました。
    F# なので参考にはしにくいかもしれませんが。
    http://www.fssnip.net/dC/title/fast-Fourier-transforms-FFT-



    No91927 (えんえん さん) に返信
    > For r As Integer = 0 To n - 1 Step n_radix
    >   fft(n_radix, theta * radix, tmpr, tmpi, ar, ai, r_st + r)
    > Next r
    > としてみましたが、
    > それでも、やはり正しい結果は得られないのですが、なぜでしょうか?

    オリジナル版にある
     fft(n_radix, theta * radix, &tmpr[r], &tmpi[r], ar, ai);
    ってのは
     fft(n_radix, theta * radix, &tmpr[r], &tmpi[r], &ar[0], &ai[0]);
    でもあるわけですし、再帰で tmpX と aX が入れ替わる点が肝かと思います。

    すなわち、index の offset は r_st 一つでは足りなくて、
    a 系と tmp 系の両方に対して用意すべきかと思います。
記事No.91899 のレス /過去ログ158より / 関連記事表示
削除チェック/

■92205  エクセルファイルを作成して表示する方法について
□投稿者/ 河童 -(2019/09/01(Sun) 09:38:12)

    分類:[C#] 

    エクセルファイルを作成して表示する方法について

    フォームにあるボタンのクリック時イベントでエクセルファイルを作成して、
    それを開いて表示したいと思っています。

    エクセルファイルの作成はできたのですが、
    1.Interop.Excelで作成
    2.ClosedXMLで作成
    それぞれわからないことがあります。

    1.Interop.Excelで作成
    インストールされているエクセルのバージョンがExcel2007、2010、2019とばらばらなことと、
    プロセスが残りやすいのであまり使用しない方がいいとネット情報にありました。
    確かにタスクマネージャーのプロセスに「EXCEL」が残っていたことがありました。
    今のコード上で解放の処理はしているのですが、どこか修正すべき点はありまか?

    2.ClosedXMLで作成
    ClosedXMLでエクセルを作成して保存はできるのですが、今回は保存までは必要なく
    エクセルにデータを入力して、エクセルを開いた状態のままにしておきたいです。
    ClosedXMLで作成したエクセルを開いたままにする方法はありますか?

    using ClosedXML.Excel;
    using Excel = Microsoft.Office.Interop.Excel;
    using System.Runtime.InteropServices;

    private Microsoft.Office.Interop.Excel.Application xls = null; // Excel自体
    private Microsoft.Office.Interop.Excel.Workbook book = null; // ブック
    private Microsoft.Office.Interop.Excel.Worksheet sheet = null; // シート

    public void ExcelVisibleToggle(Microsoft.Office.Interop.Excel.Application xls, bool setting)
    {
    if (xls.Visible == !setting)
    {
    xls.Visible = setting;
    }
    }

    // エクセル使用
    private void btnExcel_Click(object sender, EventArgs e)
    {

    this.xls = new Microsoft.Office.Interop.Excel.Application();
    // Excelを非表示:レスポンス向上
    ExcelVisibleToggle(xls, false);

    this.book = xls.Workbooks.Add();

    this.sheet = (Microsoft.Office.Interop.Excel.Worksheet)this.book.Sheets["sheet1"];

    // エクセルファイルに項目名を表示
    Excel.Range w_rgn = this.sheet.Cells;
    try
    {
    w_rgn[1, 1].value = "項目名1";
    w_rgn[1, 2].value = "項目名2";
    w_rgn[1, 3].value = "項目名3";
    w_rgn[1, 4].value = "項目名4";
    w_rgn[1, 5].value = "項目名5";

    int cell_row = 2;
    // DataGridViewのソースリストをループ
    foreach (dgvKoumokuLst d in DgvKoumokuLst)
    {
    w_rgn[cell_row, 1].value = d.koumoku1;
    w_rgn[cell_row, 1].EntireColumn.AutoFit();
    w_rgn[cell_row, 2].value = d.koumoku2;
    w_rgn[cell_row, 2].EntireColumn.AutoFit();
    w_rgn[cell_row, 3].value = d.koumoku3;
    w_rgn[cell_row, 3].EntireColumn.AutoFit();
    w_rgn[cell_row, 4].value = d.koumoku4;
    w_rgn[cell_row, 4].EntireColumn.AutoFit();
    w_rgn[cell_row, 5].value = d.koumoku5;
    w_rgn[cell_row, 5].EntireColumn.AutoFit();
    cell_row++;

    }
    }
    finally
    {
    // Excelのオブジェクト開放する
    Marshal.ReleaseComObject(w_rgn);
    w_rgn = null;
    }

    // シートを選択
    ExcelVisibleToggle(xls, true); // Excel表示

    // Sheet解放
    Marshal.ReleaseComObject(sheet);
    // Book解放
    //xlBook.Close();
    Marshal.ReleaseComObject(book);

    // Excelアプリケーションを解放
    //xlApp.Quit();
    Marshal.ReleaseComObject(xls);

    }


    // ClosedXML使用
    private void btnClosedXML_Click(object sender, EventArgs e)
    {

    // エクセルオープン
    var workbook = new XLWorkbook();
    var worksheet = workbook.Worksheets.Add("CSV一覧");
    worksheet.Cell(1,1).Value = "Hello world";

    // 項目名を表示
    worksheet.Cell(1, 1).Value = "項目1";
    worksheet.Cell(1, 2).Value = "項目2";
    worksheet.Cell(1, 3).Value = "項目3";
    worksheet.Cell(1, 4).Value = "項目4";
    worksheet.Cell(1, 5).Value = "項目5";

    int cell_row = 2;
    // DataGridViewのソースリストをループ
    foreach (dgvKoumokuLst d in DgvKoumokuLst)
    {
    worksheet.Cell(cell_row, 1).Value = d.koumoku1;
    worksheet.Column("A").AdjustToContents();
    worksheet.Cell(cell_row, 2).Value = d.koumoku2;
    worksheet.Column("B").AdjustToContents();
    worksheet.Cell(cell_row, 3).Value = d.koumoku3;
    worksheet.Column("C").AdjustToContents();
    worksheet.Cell(cell_row, 4).Value = d.koumoku4;
    worksheet.Column("D").AdjustToContents();
    worksheet.Cell(cell_row, 5).Value = d.koumoku5;
    worksheet.Column("E").AdjustToContents();

    cell_row++;

    }

    // workbook.SaveAs(@"C:\Temp\test1.xlsx");

    // CmnMsgBox.Show("出力完了", 2);

    // 作成したエクセルファイルを開いて表示したい

    }
親記事 /過去ログ159より / 関連記事表示
削除チェック/

■92206  Re[1]: エクセルファイルを作成して表示する方法について
□投稿者/ 魔界の仮面弁士 -(2019/09/01(Sun) 17:44:36)
    No92205 (河童 さん) に返信
    > 2.ClosedXMLで作成
    > ClosedXMLでエクセルを作成して保存はできるのですが、今回は保存までは必要なく
    > エクセルにデータを入力して、エクセルを開いた状態のままにしておきたいです。
    > ClosedXMLで作成したエクセルを開いたままにする方法はありますか?

    ClosedXML の場合、SaveAs メソッドが Stream への保存をサポートしているので、この辺と組み合わせてみるとか。
    http://atata.sakura.ne.jp/net/chap29.html

    あるいは、シート内容を表示することだけが目的なら、ReoGrid を使うという手もあります。
    オンメモリでのワークブック生成が可能ですし、それを表示するためのコントロールも用意されています。
    https://reogrid.net/jp/document/


    > 1.Interop.Excelで作成
    個人的には積極的にお奨めはしていませんが、Excel の機能を十分に呼び出せる
    強力な方法ではありますので、用途に応じて使い分けるものかなと思います。


    > インストールされているエクセルのバージョンがExcel2007、2010、2019とばらばらなことと、
    バージョンによって、void 戻り値なメソッドが object 戻り値なメソッドに変化したり、
    省略可能な引数が追加されたりといった拡張が行われることがあります。

    新しく追加した機能を使わないようにすれば、VBA においては大きな差にはなりませんし、
    COM レベルにおいても、ディスパッチ ID と不可視属性の組み合わせが使われることで
    ある程度の互換性が保たれてはいるのですが、それでも、上位バージョンのライブラリを使って
    開発したアプリケーションを下位バージョン環境で動作させようとした場合には、
    問題が生じる可能性があります。

    また、ストアアプリ版と Windows Installer 版とでの動作の違いや、Office 365 での
    更新サイクルの短期化などがあるため、バージョン違いを正確に考慮して
    コーディングするのは、ますます難しくなってきています。


    > プロセスが残りやすいのであまり使用しない方がいいとネット情報にありました。
    解放手続きの話という事で、このあたりも。
    https://social.msdn.microsoft.com/Forums/ja-JP/0d9c6273-bade-4f6a-a0de-5adb748d15eb/office?forum=officesupportteamja


    たとえば、COM オブジェクトを引数に渡すタイプのメソッドを呼び出す場合、
    参照設定なしで dynamic や object を渡した場合と、
    PIA を経由で明示的な Excel の型として渡した場合と、
    動的生成された IA の型を通じて渡した場合とで、参照カウントの増数が異なるらしく、
    ReleaseComObject 時の戻り値の値が変化したこともあります。


    > // Excelを非表示:レスポンス向上
    アプリケーションを非表示にすることがレスポンス向上に繋がるかは、実はケースバイケースです。
    シートを非表示にしたり、描画抑制するなどして操作する方法であれば、レスポンス向上になることが多いのですが、
    Application.Visible = false; については、向上する場合もあれば、むしろ低下することもあるのでご注意ください。

    本体が非表示となった場合、Excel.exe がバックグラウンド処理に回されることから、実行環境によっては、
    処理速度が半分未満に低速化することがあります。OS 設定や プロセッサ構成などの要因によって、
    謙虚に反映されてしまう場合もあれば、問題無い場合もありますので、実際の環境で試した上で判断が必要です。


    > this.book = xls.Workbooks.Add();
    books = xls.Workbooks;
    book = books.Add();
    とします。Marshal.IsComObject(books) が true である場合、
    book のみならず books も解放対象となります。


    > this.sheet = (Microsoft.Office.Interop.Excel.Worksheet)this.book.Sheets["sheet1"];
    こちらも同様で、
    // sheets = book.Worksheets;
    sheets = book.Sheets;
    sheet = (Microsoft.Office.Interop.Excel.Worksheet)sheets["sheet1"];
    としたうえで、Marshal.IsComObject(sheets) が true なら、sheets も解放対象です。


    > w_rgn[1, 1].value = "項目名1";
    Excel.Range w_rgn11 = w_rgn[1, 1];
    w_rgn11.Value = "項目名1";
    if (Marshal.IsComObject(w_rgn11)) {
     Marshal.ReleaseComObject(w_rgn11);
    }

    なお、C# のバージョンが古い場合には、
     w_rgn11.set_Value(Type.Missing, "項目名1");
    の形式が求められることがあります。今回は当てはまりませんけれども。


    > w_rgn[cell_row, 1].EntireColumn.AutoFit();
    これも、EntireColumn が返すオブジェクトを変数に受けておくべきです。

    rngEntireColumn.AutoFit();
    if (Marshal.IsComObject(rngEntireColumn)) {
     Marshal.ReleaseComObject(rngEntireColumn);
    }


    個別の解放手続き面倒であれば、アプケーションドメインを別途立てて実行し、
    作業した AppDomain ごと Unload するという手もありますが、それはそれで面倒かも。
記事No.92205 のレス /過去ログ159より / 関連記事表示
削除チェック/

次の20件>

<< 0 | 1 | 2 >>

ヒット件数が多いので過去ログ148〜179 までの検索結果 / 過去ログ0からさらに検索→

パスワード/

- Child Tree -