カテゴリー: Visual Studio (2ページ目 (3ページ中))

【C#】指定したエクセルを開く

ボタンを押した際に指定したエクセルファイルを起動させるプログラムを作りました。
(一応プロセスの解放漏れがないようにしたつもりです。。)

■前提
参照の追加で「Microsoft Excel ~~~ Object Library」を追加する。
usingに「Microsoft.Office.Interop.Excel」と「System.Runtime.InteropServices」いれる

解放の処理でだいぶ悩みましたが、取り敢えず使ったものは全部解放します。

31行目以降にある「Marshal.ReleaseComObject」は解放するCOMの指定が出来るので、
今回であれば「ExcelApp」、「books」、「book」を解放の対象とします。

38行目の「GC.Collect()」はガーベージコレクションを強制するメソッドです。

【C#】EXCELシート追加、シート名変更

今回は特定のエクセルファイルにシート追加、名称変更をするがテーマ!

 

■前提
 今回はMicrosoft.Office.Interop.Excelを使用するので参照設定を
 追加する必要があります。

 

※注意!
COMオブジェクト解放(ReleaseComObject)の処理とかしてないので、
途中終了とかするとプロセスが残り続けます。
取り敢えず動かしてみたい!って人向けの簡単なコードです。

 

■17~20行目
 →EXCELの起動および指定ファイルを開く処理を行います。
  「ExcelApp.Visible = (  )」はtrue、falseにすることが出来ますが
  エクセルの画面が見えるか見えないかだけの違いかと思います。
  ここは実際に試してみた方が分かりやすいです。
  
  この時点でなんかエラーで起動できない!とかあったら以下の記事内容も
  お試しください。(Office修復、再インストール、レジストリチェック、ビルド変更)

【C#】EXCEL起動 エラー回避

 

■23~24行目
 →シートの追加にはAddメソッドを使います。
  「After:~~」の箇所が、どこのシートの後に追加するかって感じです。
  なので、シートの最大数(bef_totalSheets)を設定してあげることで
  末尾に新規シートを追加することが可能です。
   ※この時点では追加されるシート名はデフォルトの「Sheet~」

■27~30行目
 →ここではさっき追加したシート名の名称変更を行います。

  1.まずはシート追加後のシート数の取得を行います。
  23行目と同じくシートの最大数を取得するのですが、
  シート追加した後の値が欲しいので新しく変数を設定します。(aft_totalSheets)

  2.次に末尾シート名の取得です。
  ここはそのままな感じですね、(aft_totalSheets)番目の名称です。

  3.ここで名称変更です。
  2.で設定したシート名を変更する処理ですね。
  31文字より多い文字列に設定するとエラーになるので注意しましょう。
   ※EXCEL自体も32文字以上のシート名に出来なかったかと思います。

【C#】EXCEL起動 エラー回避

C#でExcelを起動させてみようと思い、試行錯誤していましたが
エラーが発生して上手いこといかず苦戦していました。

 

■エラー内容
System.InvalidCastException: ‘型 ‘Microsoft.Office.Interop.Excel.ApplicationClass’ の

COM オブジェクトをインターフェイス型 ‘Microsoft.Office.Interop.Excel._Application’ に
キャストできません。IID ‘{000208D5-0000-0000-C000-000000000046}’ が
指定されたインターフェイスの COM コンポーネント上での QueryInterface
呼び出しのときに次のエラーが発生したため、この操作に失敗しました:
インターフェイスが登録されていません (HRESULT からの例外:0x80040155)。’

 

■確認したこと
 →Officeの修復、再インストールも試しましたが改善せず。
  また、過去に別バージョンのOfficeを使っているとレジストリに
  不要な設定が残ってしまうことがあるようで、
  そっちも確認しましたが特に問題はなさそう。。

※HKEY_CLASSES_ROOT\TypeLib\{00020813-0000-0000-C000-000000000046}に
 「1.9」とは別に「1.8」が残っていることがあるようで、消すと上手くいくこともあるようです。
 消すときは必ずバックアップ取りましょう。

 

何やかんや調べていたら解決したので書き残しておきます。
原因が分からないので一概に直るとはいえないのですが、、

ソリューションエクスプローラーのプロパティから「ビルド」を選択。
プラットフォーム項目の設定を変更しました。(以下画像の通り)

【C#】ログイン画面を作る

利用者IDとパスワードを入力して、データベース上に一致する
レコードが存在すれば認証成功、なければ認証失敗みたいなものを作ります。

完成した画面はこんな感じ。
利用者IDとパスワードのテキストボックスに文字列を入力し、
「ログイン」ボタンを押した際に検索結果に応じてメッセージボックスで
認証可否の結果を出します。

 

 

※今回はSQLサーバに接続するので「SqlConnection」とか使います。
 MDBの時は「OledbConnection」だったんですが細かいことは分からないです。
 (初心者なので動けば大丈夫って感じなので鵜呑みにはしないでください、、)

 

■21行目
 →検索用のSQL文は、データベース上の[USER_NAME]列、[PASSWORD]列と
  一致の条件にするのでANDとすることで、ID一致かつパスワード一致みたいな
  感じになると思います。

■29~30行目
 →SQL文の実行結果をdatatableに格納します?
  その後、行数を取得します。
■32行目
 →今回のSQL文は条件に一致するレコードがある場合、必ず行数は1になるはず!なので
  IF文はrowcountが1のときログインに成功したと判断させます。

【C#】MDB テーブル一覧を取得する

書いてみたコードはこんな感じ

 

実行したときの動作は以下画像の通り。

 

15行目~28行目のファイル選択画面をあげるコードは
こっちが参考になればと思います。

【C#】OpenFileDialogのFilterについて

30行目~49行目のざっくり解説

・listBox1.Items.Clear()
 →リストボックスの中身をクリアする処理ですが、これがないと
  「テーブル一覧取得」ボタンを押しただけ表示が増えていくので必須です。

string constr = @”Provider=Microsoft~~~
 →接続に使う文字列を定義しているところって感じでしょうか、、、
  Data Source=~~~はどこのデータ使いますか?的なものですかね
  ※今回の例であれば、「D:\Study\TEST.mdb」です。

using (OleDbConnection conn = new OleDbConnection(constr)
 →OleDbConnectionはデータソースに接続するために使うもの?ですかね
  接続のための文字列は一個前で定義した「constr」を使ってる感じです。

conn.Open()、conn.Close()
 →接続を開きます、閉じますってやつだと思う。

・40~45行目
 →ごめんなさい、よくわからないです。。。
  GetSchemaでファイルの情報を抜いてこれる感じなのかな?
  foreachのところは繰り返し処理でリストボックスに値を入れてるだけです。
 

知識不足で間違ってるところも多々あるかと思いますので
参考程度にお願いします。

【C#】OpenFileDialogのFilterについて

ボタンを押したときにファイル選択の画面を上げます。
そのときに拡張子でフィルターがかけられるのですがそのお話です。

コードはこんな感じ。

 

おおまかには下の画像の通りだと思います。
Title = “ファイルを選択してください。”
 →ファイル選択画面のウィンドウタイトルにあたる部分です。
InitialDirectory = @”D:\Study”
 →起動ディレクトリのこと(どこのフォルダがデフォルトで表示されるか)

【C#】別のフォームに値を渡す

別フォームに値を渡す方法について調べていたのですが、
難しくてよく分からなかったので動けばいいや的な人向けです。

 

 

まずForm1から

 ■15~16行目
 Form2を表示させるだけ

 ■18~19行目
 Form2の「text」に適当な文字列を入れます。

 

つぎにForm2

 ■44行目
 「public string //// { get; set; }」の////部分はForm1で記述した
 「Form2.////」←ここ

【C#】テキストボックスから特定行の取得、表示をする方法

「□行目を表示します」の□に数字を入れ、
「button1」を押すとその行数目の文字列を取得するもの。

 

■1~8行目
ロード時の処理です。果物の名前とか5行入れてますが別に何でもいいです。

■12~13行目
「textbox2」の中に入力した文字列(string型)を
数字(int型に)変換する処理です。

■15~16行目
「textbox.Lines[(ここに数字)]」で行数の指定が出来るので、
[i-1]としてあげることで入力した数字と同じ行数の文字列が取得できます。
※要素数は「0」から数えるので「-1」してあげる必要があります。

 

 

正しい入力だけをする場合なら上で書いたもので問題ないと思います。
でも空白だったり、指定した数が実際の行数より多かったりした場合も
考える必要がありますね。それを加えたのが以下になります。

※ホントは数字かの判定も必要なんですがよく理解できませんでした、、、
 分かったら追記しようと思います。

 

 

【C#】現在時刻、月初日、月末日の取得

1.現在時刻の取得

※「現在時刻」のボタン押したときに隣のテキストボックスに表示させるようにしています。

 

この表示の通りですね。

ToString yyyy/mm/dd hh:mm:ss
ToShortString yyyy/mm/dd
ToLongString yyyy年mm月dd日
ToString(書式を設定する) 書式によって

こちらのサイト様の記載が非常に参考になりました。
URL : https://dobon.net/vb/dotnet/string/datetimeformat.html

 

※「DateTime.now」と「DateTime.Today」はどちらも現在日を取得出来ますが、
 「DateTime.Today」については時刻部分が「0:00:00」となります。

 

2.月の初め、終わりの日を取得する。

■月初めについて(7行目)
DateTimeの中身はカンマ区切りで「年」、「月」、「日」になってるので
「today.year」で今年、「today.month」で今月、「1」で日付を1日とします。
これで月初めの日付が取得できます。

 

■月終わりについて(10行目)
こっちは翌月の1日から1日引くことで、当月末の日付を出す方法を使います。

「DateTime(today.year, today.month, 1)」の部分は同じで当月1日を取得。
その後、「AddMonth(1)」で翌月の1日を出し、「AddDays(-1)」で
月終わりの日付が出せます。

【C#】DataGridViewでファイルを出力する

 

・左画像が出力したいもの、右画像がCSVの出力物。

 

※動作の前提としてDataGidViewの「追加を有効にする」をOFFにしてること。
 ONの場合は行数の処理で調整してあげる必要があった気がします、、

 

 

■3~11行目は、この下画面を出すための記述です。
 ・「Title」がウィンドウの名前
 ・「InitialDirectory」はデフォルトのファイル出力先
 ・「FileName」はデフォルトのファイル名
 ・「Filter」はファイルの種類のところ

■13行目
 ・「StreamWriter」とかいうのはファイルにテキストを書き込むものです。
  「@”C:\Users~~」は書き込むファイルへのパス
  「Encoding.GetEncoding(“shift_Jis”)」で文字コード指定する。

■15~16行目
 ・DataGridViewのRowCount(行数)、ColumnsCount(列数)を取得する。

■20~22行目
 ・「DataGridViewのk列目のヘッダーセルの値をListに追加する」←この処理を
  列数ぶん繰り返します。

■30~44行目
 ・34~37行目では、j列目 i行目の値をListに入れる処理を行います。

  例えば1回目にこの処理が流れる場合、i = 0 , j = 0なので
  DataGidView上の「1」がリストへ
  34行目のfor分によってjの値は1づつ増えていくため、 i = 0 , j = 1 となり
  「くだもの」が入るわけですね。

   あとは繰り返しなので 「1 ー くだもの ー りんご ー 100」がListに入ります。

  なので、上記の処理を今度は行数ぶん繰り返す(30行目)ことで、
  ヘッダを含むDataGidViewの内容をファイルに出力することが出来ます。

 

※補足( 「追加を有効にする」がONのとき )

 

« Older posts Newer posts »