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

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

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

全過去ログを検索

<< 0 >>
■2850  Re[2]: VB.NETから、Excelのマクロを動かす方法は?
□投稿者/ じゃんぬねっと -(2007/04/17(Tue) 15:56:20)
>
    No2845 (みこ さん) に返信
    > VB.NETから、Excelの既存ブックを開き、そのブックにあるマクロを動かしたいのですが、どのようにすればよいでしょうか?
    > 宜しくお願いしまーす。

    何を使って実現したいのでしょうか?
    VSTO でしょうか? Office PIA でしょうか?

    Office PIA であれば、

     1. Microsoft Excel xx.x Object Library を参照に加えます。
     2. Excel.Application インターフェイスをインスタンス化して Excel アプリケーションを起動します。
     3. Excel.Application インターフェイスのインスタンスから、Workbooks コレクションに Open した Workbook を加えます。
     4. その後、Excel.Application インターフェイスから Run メソッドを呼び出す。

    と、Run メソッドの引数で指定した関数 (メソッド) が実行できまーす。
記事No.2845 のレス /過去ログ11より / 関連記事表示
削除チェック/

■58036  Re[2]: MSFLEXGRIDのスコープ範囲
□投稿者/ コアラ主任 -(2011/03/24(Thu) 10:23:25)
    >  Public mainForm As Form2
    > のように、別の名前に変更しておく事をおすすめします。
    >
    No58032 (魔界の仮面弁士 さん) に返信
    > ■No58025 (コアラ主任 さん) に返信
    >>それとも、自分のプログラミングにより、そのようになっているの
    >>でしょうか。
    > だと思います。
    >
    > 未初期化のフォームが自動ロードされてしまっているのでしょう。
    >
    >
    >>別のフォームから、そのMSFLEXGRIDのrows値を参照すると
    >>フォーム側(?)プロパティで設定してある2と言う値で参照されます。
    > Rows をセットする際に、フォームと MSFlexGrid の hWnd プロパティを
    > Debug.Print してみてください。
    >
    > そして、Rows が 2 になってしまっている所でも、同様に
    > それらの hWnd プロパティを参照してみてください。
    >
    > もしも「セットした時」と「参照した時」がそれぞれ同一のフォームだとすれば、
    > hWnd 値は同じものになるはずです。それらが違う値になってしまうようであれば、
    > 別のフォームとコントロールを参照していることを意味します。
    >
    >
    >Public main_form As main_form
    > 変数名と型名が同じになっているのが、混乱の要因かと思われます。
    > また、フォームがアンロードされた時には、変数名に Nothing を代入する事を
    > 忘れないようにしてください。そうしないと、自動ロードの危険性が高まります。
    >
    > Dim f As Form3
    > Set f = New Form3
    > Load f
    > Debug.Print ObjPtr(f), f.hWnd '元のフォーム
    > f.Caption = "New Caption" 'Captionを変更する
    > f.Show vbModal
    > Unload f 'アンロードしてあるが、
    > 'Set f = Nothing 'Nothing はセットしていないし、
    > 'Set f = New Form3 '新たなインスタンスもセットしていない
    >
    > MsgBox f.Caption 'この時点で自動ロードされてしまう
    > Debug.Print ObjPtr(f), f.hWnd '別のフォームになっている
    >
    >
    > 上記の場合、ObjPtr(f) が一致する事からもわかるように、
    > オブジェクトとしては同一のインスタンスですが、
    > f.hWnd は別物であるため、自動ロードされた
    > 別のフォームになってしまう事がうかがえます。
    >
    >
    >> Set main_form = New main_form
    >> Load main_form
    > New して使う事を前提にしている場合、暗黙のForm変数にアクセスできないようにするため、
    >
    > 'Form2(呼ばれる側)
    > Option Explicit
    > Private Sub Form_Initialize()
    >  Set Form2 = Nothing '暗黙の変数を消しておく
    > End Sub
    >
    > のようにしておくと良いでしょう。こうすれば、
    >  Set f = New Form2
    >  Load f
    >  f.Show
    > のようなコードは正常に実行できますが、
    >  Load Form2
    >  Form2.Show
    > のようなコードが実行時エラーになるので、コードバグを検知しやすくなります。

    ご丁寧なご回答ありがとうございます。

    > 未初期化のフォームが自動ロードされてしまっているのでしょう。
    そうだったのですね。

    >Public main_form As main_form
    > 変数名と型名が同じになっているのが、混乱の要因かと思われます。
    > また、フォームがアンロードされた時には、変数名に Nothing を代入する事を
    > 忘れないようにしてください。そうしないと、自動ロードの危険性が高まります。
    はい、ちょくちょく、やっているので今後、気をつけたいと思います。
    hWnd 値の確認は、他のプログラミングにも、役立つと思いますので、
    提示いただいた検証を実施したいと思います。
    ありがとうございました。
    m(__)m
記事No.58025 のレス / END /過去ログ97より / 関連記事表示
削除チェック/

■92980  Re[4]: Listの入れ子があるListをソースに設定する方法について
□投稿者/ 河童 -(2019/11/12(Tue) 13:57:18)
    No92952 (魔界の仮面弁士 さん) に返信
    
    たくさんアドバイスいただいて、ありがとうございます。
    少し頭が混乱してきました。
    
    申し訳ないです。やっぱりリストを使って処理を行いたいです。
    
    Listの入れ子があるListをソースに設定する方法について
    やりたいことを整理しました。
    
    画面上にDataGridViewが3つあります。
    dgvGroup
    dgvTeam
    dgvUser
    
    DataGridViewのソースとなるデータは、外部ファイルからリスト型で読み込まれます。
    この処理は実装済みです。
    読み込んだリスト型のデータを各DataGridViewのソースに設定したいです。
    
    画面上の動きとしては、
    画面のロード時にグループ(GroupA)を表示
    「GroupA」を選択するとチーム(TeamA)を表示
    「TeaA」を選択するとユーザ(User1)を表示
    のように段階を踏ませたいです。
    
    グループ、チーム、ユーザの新規追加は、
    別フォームを開いてから登録処理を実行させようと思っています。
    
    今わからないことは、
    段階的にDataGridViewを表示させる方法です。
    ロード時に入れ子のリストごとに新たにリスト作成して
    それをDataGridViewのソースに設定しています。
    
    どのように各DataGridViewのリストのソースを設定すれば良いでしょうか?
    
    Groupが選択されたときにTeamのDataGridViewのソースの作成方法
    Teamが選択されたときのUserのDataGridViewのソースの作成方法
    group_numとteam_numのキーの渡し方がわかりません。
    
    
            // グループリスト
            List<GroupInfo> GroupLst;
            public class GroupInfo
            {
                public int group_num { get; set; }
                public string group_name { get; set; }
                public List<TeamInfo> teamList = new List<TeamInfo>();
            }
            public class TeamInfo
            {
                public int team_num { get; set; }
                public string team_name { get; set; }
                public List<UserInfo> userList = new List<UserInfo>();
            }
            public class UserInfo
            {
                public int user_num { get; set; }
                public string user_name { get; set; }
            }
    
    
            // DataGridView用
            public class dgvGroupInfo
            {
                public int group_num { get; set; }
                public string group_name { get; set; }
            }
            public class dgvTeamInfo
            {
                public int team_num { get; set; }
                public string team_name { get; set; }
            }
            public class dgvUserInfo
            {
                public int user_num { get; set; }
                public string user_name { get; set; }
            }
    
            List<dgvGroupInfo> DgvGroupLst;         // グリッド用グループリスト
            int RowIdx1 = 0; // 選択行インデックス
            List<dgvTeamInfo> DgvTeamLst;       // グリッド用チームリスト
            int RowIdx2 = 0; // 選択行インデックス
            List<dgvUserInfo> DgvUserLst;     // グリッド用ユーザリスト
            int RowIdx3 = 0; // 選択行インデックス
    
            private void FormMain_Load(object sender, EventArgs e)
            {
    
                // リストデータ作成
                GroupLst = new List<GroupInfo>();
                GroupInfo d = new GroupInfo();
                d.group_num = 1;
                d.group_name = "GroupA";
                d.teamList = new List<TeamInfo>();
                TeamInfo t = new TeamInfo();
                t.team_num = 1;
                t.team_name = "TeamA";
                t.userList = new List<UserInfo>();
                UserInfo u = new UserInfo();
                u.user_num = 1;
                u.user_name = "User1";
                t.userList.Add(u);
                d.teamList.Add(t);
                GroupLst.Add(d);
    
                // DataGridViewソース作成
                CreatDgvSource();
    
            }
     
            void CreatDgvSource()
            {
                // リスト更新、表示
                dgvGroup.DataSource = null;
                dgvTeam.DataSource = null;
                dgvUser.DataSource = null;
    
                // リストのデータを取得
                int iRet = Create_DgvLst();
                if (iRet == -1) return;
    
                // グループのソースセット
                dgvGroup.DataSource = DgvGroupLst;
    
                // チームのソースセット
                dgvTeam.DataSource = DgvTeamLst;
    
                // ユーザのソースセット
                dgvUser.DataSource = DgvUserLst;
    
                // 選択行設定
                if (RowIdx1 >= dgvGroup.Rows.Count) RowIdx1--;
                if (dgvGroup.Rows.Count > 0 && RowIdx1 < 0) RowIdx1 = 0;
             
                dgvGroup.Refresh();
                dgvTeam.Refresh();
                dgvUser.Refresh();
            }
    
            private int Create_DgvLst()
            {
                // グリッド用リストを初期化
                DgvGroupLst = new List<dgvGroupInfo>();
                DgvTeamLst = new List<dgvTeamInfo>();
                DgvUserLst = new List<dgvUserInfo>();
    
                // 取得データからリストを作成
                foreach (var g in GroupLst) // グループ
                {
                    dgvGroupInfo d1 = new dgvGroupInfo();
                    d1.group_num = g.group_num;
                    d1.group_name = g.group_name;
    
                    DgvGroupLst.Add(d1);
    
                    foreach (var t in g.teamList)  // チーム
                    {
                        dgvTeamInfo d2 = new dgvTeamInfo();
                        d2.team_num = t.team_num;
                        d2.team_name = t.team_name;
    
                        DgvTeamLst.Add(d2);
    
                        foreach (var u in t.userList)  // ユーザ
                        {
                            dgvUserInfo d3 = new dgvUserInfo();
                            d3.user_num = u.user_num;
                            d3.user_name = u.user_name;
    
                            DgvUserLst.Add(d3);
                        }
                    }
                }
                return 0;
            }
    
    
記事No.92931 のレス /過去ログ161より / 関連記事表示
削除チェック/

■92983  Re[5]: Listの入れ子があるListをソースに設定する方法について
□投稿者/ 魔界の仮面弁士 -(2019/11/12(Tue) 14:24:25)
    No92980 (河童 さん) に返信
    > 画面上にDataGridViewが3つあります。

    これらは ReadOnly でしょうか?

    編集可能とする場合は、さらに

    (1)主キーの変更を許可するか否か
    (2)データの削除を許可するか否か
    (3)新規レコードの作成を許可するか否か

    についても考える必要があります。
    (許可する場合、それぞれに応じた追加の処理が必要です)


    > 読み込んだリスト型のデータを各DataGridViewのソースに設定したいです。

    その場合のコードは No92952 に示しています。



    > DataGridViewのソースとなるデータは、外部ファイルからリスト型で読み込まれます。
    > この処理は実装済みです。

    上記の入力処理(読み込み)の後、
    出力処理(リストの内容を外部ファイルに書き戻す処理)も発生しますか?

    入力処理(読み込み)だけなら、さほど問題は無いのですが、
    出力処理もある場合、単純なファイルの再生成だけで良いのかでも設計が変わってきます。

    上書き再生成で出力するのならば良いですが、データベース等が相手だと、
     -- group_num が 100 のレコードを、データベースから削除する
     DELETE FROM GRP_TBL WHERE NUM = 100
    のように「削除対象の group_num の一覧」を覚えておく必要があるため、
    単純に GroupLst から .Remove() されるだけだと都合が悪くなるかもしれません。
    主キー項目の書き換えを許可する場合も同様。



    > 段階的にDataGridViewを表示させる方法です。

    No92952 の RowEnter では駄目ですか?


    > int RowIdx1 = 0; // 選択行インデックス

    DataGridView は列クリックでのソートも可能なので、インデックスでのアクセスはお奨めしません。

    .DataSource にバインドしている場合には、 No92952 に示したように、
    選択行の DataBoundItem プロパティから該当レコードを参照するようにします。
記事No.92931 のレス /過去ログ161より / 関連記事表示
削除チェック/

■95122  Re[1]: 仕様?誤使用?
□投稿者/ ぶなっぷ -(2020/06/24(Wed) 15:42:52)
    少々疑問が、
    これってforeachで回しながら削除してますよね。
    そーすると、
      InvalidOperationException
      「コレクションが変更されました。列挙操作は実行されない可能性があります。」
    になりませんか?ならないのが不思議です。
    
    それはさておき、修正案ですが、Controlsがいわゆるコレクション(List, Arrayy, ...)
    なら、LINQメソッド(拡張メソッド)を使うのがおすすめ。
    
    以下の1行でおしまいです。
      int RemoveCnt = Controls.RemoveAll(x => x.Name == "AccountElement");
記事No.95114 のレス /過去ログ165より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -