Compartilhar via


データベースから取得したレコードを Excel シートの行に挿入するサンプル(発注書) C# 版

[今日のみちしるべ 第3回 アクセス数上昇の分析]

最近、このブログのアクセスが増えています。

まだ、はじめたばかりで、若輩でもあるので、トータルはそんなでもないですが、3割くらい増えた気がします。

要因として考えられるものとして、いくつかあげられますが、

まずは、マイクロソフトのブログ執筆者紹介のページで紹介されていることでしょうか。

https://www.microsoft.com/japan/powerpro/community/blog/default.aspx

image

ここに取り上げられると更新されたブログが一覧で出てきますので、これも考えられます。

次に考えられるのが、Tech-ED 2008 のページが更新されたのもあるでしょうか。

私が担当予定のセッションへのリンク " Visual Studio 2008 を使った Office 開発の道標" が用意されました。

私の顔写真(実物はもう少しいい男です。(そう信じています。))もありますし、意気込みも記載しておりますので、もしよろしければ、御覧になって下さい。

image

あとは、このコーナー「今日のみちしるべ」のおかげでしょうか。まだ、3回目ですが、、、プレゼンテーターとして、十分すぎるつかみと予想を超えたオチなどがびっしりつまった(?)このコーナーが好評でアクセス数が上がったに違いない!はずです。

いつの日かそう言われるように日々精進していきます。。。

それ以外だと、個別対応やセミナーで私のブログを案内しているからでしょうか。

これからもアクセス数が落ちないように面白いネタを毎回用意したいと思います。

見てくださっている皆様に感謝です!

[本題]

さて、本題に入りますが、ご紹介した記事「データベースから取得したレコードを Excel シートの行に挿入するサンプル(発注書)VB版」の C# 版を公開したいと思います。

基本的な動きは変わりません。

なので、データ接続やコントロール系の部分は VB 版のところを参照してみてください。

C# での開発要件や VSTO の検証をおこなわれる場合などにご活用ください。

ThisWorkbook.cs

※主に作業ウィンドウの呼び出しです。

namespace Orderform2
{
    public partial class ThisWorkbook
    {
        public ProductInfo uc = new ProductInfo();
        private void ThisWorkbook_Startup(object sender, System.EventArgs e)
        {
            Globals.ThisWorkbook.ActionsPane.Controls.Add(uc);
        }

    }
}

AddItemClass.cs

※クラスを利用して、作業ウィンドウ上の複数データをシートに挿入します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms; //参照を追加
using Excel = Microsoft.Office.Interop.Excel;

namespace Orderform2
{
    class AddItemClass
    {

        Excel.Range RangeLast = Globals.Sheet5.Range["D8", "D8"].get_End(Excel.XlDirection.xlDown);

  public AddItemClass(string ProductNumber, string ProductName, string ProductUnitPrice)
        {

            if (RangeLast.Row > 18)
            {
                MessageBox.Show("一度に10個以上の商品の発注はできません", "確認してください", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            Excel.Range RangeProductNumbers = Globals.Sheet5.Range[Globals.Sheet5.Range["D9", "D9"], RangeLast];

            foreach (Excel.Range RangeProductNumber in RangeProductNumbers)

                {
                    if((string) RangeProductNumber.Value2 == ProductNumber)

                        {
                          MessageBox.Show("この商品は既に発注書に追加されています", "確認してください", MessageBoxButtons.OK, MessageBoxIcon.Information);
                          return;
                        }
                }
                    RangeLast.get_Offset(1, 0).Value2 = ProductNumber;
                    RangeLast.get_Offset(1, 1).Value2 = ProductName;
                    RangeLast.get_Offset(1, 3).Value2 = ProductUnitPrice;

                    Globals.ThisWorkbook.RefreshAll();
        }

      }
}

ProductInfo.cs

※データセットへのデータの読み込みのハンドリングとデータを AddItemClass に渡す役割をおこなっています。

namespace Orderform2
{
    public partial class ProductInfo : UserControl
    {
        public ProductInfo()
        {
            InitializeComponent();
            this.Load += new EventHandler(ProductInfo_Load);
        }

        void ProductInfo_Load(object sender, EventArgs e)
        {
            //throw new NotImplementedException();
            this.getProductInfoTableAdapter.Fill(adventureWorksDataSet.GetProductInfo);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            AddItemClass addItemtoSheet = new AddItemClass(productNumberLabel1.Text, nameLabel1.Text, listPriceLabel1.Text);

        }
    }
}

でも、やっぱり、Office 開発は VB のほうが個人的には好きですねー。

Win フォームは C# でいいとは思うのですが。。。

サンプルは添付しておきます。

Orderform2.zip