2020年12月11日

Excel 特定のシートを複数のブックへコピーする

'特定のシートを複数のブックへコピーする
'【使い方】
'任意のシートで、"A1"から下方向に自身のブック内にあるコピー元対象のシート名を列挙する。
'"B1"から下方向にコピー先対象のブック(ファイル名)を列挙する。ファイルを自身のファイルと同じ場所に置く。
'ActiveXボタンを配置し当プロシージャを貼り付ける
Private Sub CommandButton1_Click()

'定数
Const SHEET_MAX As Integer = 10
Const BOOK_MAX As Integer = 10

'確認メッセージ
Dim res
res = MsgBox("処理を開始します。" & vbNewLine & "よろしいですか?", vbYesNo + vbDefaultButton2 + vbQuestion, "確認")
If res = vbNo Then Exit Sub

Dim curSheet As Worksheet
Set curSheet = ThisWorkbook.ActiveSheet

Dim path As String
path = ThisWorkbook.path

'コピー元シート取得
Dim sheetsBase As String
sheetsBase = "A1"
Dim sourceSheetList As Range
Set sourceSheetList = curSheet.Range(sheetsBase, curSheet.Range(sheetsBase).Offset(SHEET_MAX, 0))
'Set sourceSheetList = curSheet.Range(sheetsBase, curSheet.Range(sheetsBase).End(xlDown))

'コピー先ブック取得
Dim bookBase As String
bookBase = "B1"
Dim targetBookList As Range
Set targetBookList = curSheet.Range(bookBase, curSheet.Range(bookBase).Offset(BOOK_MAX, 0))
'Set targetBookList = curSheet.Range(bookBase, curSheet.Range(bookBase).End(xlDown))


Dim targetBook As Workbook
Dim sourceSheet As Worksheet

' 各ブックを開く
For Each bookName In targetBookList
On Error Resume Next
Set targetBook = Nothing
Set targetBook = Workbooks.Open(path & "\" & bookName.Value)
On Error GoTo 0
If Not targetBook Is Nothing Then
' 各シートをコピー
For Each sheetName In sourceSheetList
'シートを特定
On Error Resume Next
Set sourceSheet = Nothing
Set sourceSheet = ThisWorkbook.Worksheets(sheetName.Value)
On Error GoTo 0
If Not sourceSheet Is Nothing Then
'ワークブックへシートをコピー
sourceSheet.Copy After:=targetBook.Sheets(targetBook.Sheets.Count)
End If
Next
'保存する
targetBook.Save
'閉じる
targetBook.Close
End If
Next

res = MsgBox("終了しました。", vbOK + vbInformation, "メッセージ")

End Sub
タグ:Excel VBA
posted by Hiro at 19:38| Comment(0) | プログラム

2020年11月25日

SQL Server コマンドライン基礎

接続コマンド
sqlcmd -S servername -U userid -P password -d databasename
データベース一覧
USE databasename
GO
テーブル一覧
SELECT name FROM sysobjects WHERE xtype = 'U'
GO
タグ:SQL Server
posted by Hiro at 18:19| Comment(0) | プログラム

2020年11月09日

.NET Core のWebアプリからスキャフォールディングで既存のDBへ接続する

前提条件としてソフトはインストール済み、データベース、テーブルはすでにあるものとして話を進める。

Microsoft Visual Studio Community 2019
SQL Server 2019 Express

この記事では以下の構成のDBを使用して説明する。
20201108_001_DB.png

プロジェクトの新規作成
「新しいプロジェクトの作成」を選択する。
20201108_001_ins_01.png

新しいプロジェクトの作成で「ASP.NET Core Webアプリケーション」を選択する。
20201108_001_ins_02.png

「新しいプロジェクトの構成」で以下の項目を入力する。
プロジェクト名:「MyWebApp」
場所:「C:\Source\」
  ※ソリューションルートフォルダが「C:\Source\MyWebApp」となる。
ソリューションとプロジェクトを同じディレクトリに配置する:有効
20201108_001_ins_03.png

「Webアプリケーション(モデル ビュー コントローラー)」を選ぶ。
20201108_001_ins_04.png

プロジェクトの作成が終わり、
「ソリューションエクスプローラー」を開くとファイルの状態が確認できる。
20201108_001_ins_06_files.png

プロジェクトへのパッケージ追加
メニューバー>プロジェクト>NuGetパッケージの管理を選択する。「NuGetパッケージマネージャー」が開く。
「参照」を選び、キーワード入力欄の検索を使って次の3つを探し、画面の指示通りにそれぞれインストールする。
Microsoft.EntityFrameworkCore.Tools
Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.SqlServer
20201108_002_pkg_01.png

「NuGetパッケージマネージャー」を閉じる。
「ソリューションエクスプローラー」を開くと追加パッケージの状態が確認できる。
メニューバー>ファイル>すべて保存(または、すべてを保存ボタンを押下し)を選択し、ソリューションを保存する。
20201108_002_pkg_02.png

スキャフォールディングで DbContext を生成する
メニューバー>表示>その他のウィンドウ>パッケージマネージャコンソールを選択する。
「パッケージマネージャコンソール」ウィンドウが開く。
次のコマンドを張り付ける(※文字列部分は各SQLサーバーの環境ごとに書き換える)。
Scaffold-DbContext  "Data Source=localhost\SQLEXPRESS;Initial Catalog=MyTestDB;User ID=****;Password=****" Microsoft.EntityFrameworkCore.SqlServer -Tables "UserTable","DivisionTable" -ContextDir DbContexts -OutputDir "DbContexts/Entities" -Force
オプションの補足説明
-Force 既存のファイル上書き
-Tablesテーブル名を指定。"TableA","TableB",...で複数指定可能。省略すると全テーブルに対して操作する。
-Context DBコンテキストのクラス名を指定すると、任意のDBコンテキストのクラス名を指定可能。省略するとDB名から自動生成。
成功すると、以下のように表示される。
20201108_003_scf_01.png

「ソリューションエクスプローラー」から追加されたファイルが確認できる。
20201108_003_scf_02.png
先ほどと同じく、一旦すべてのファイルを保存する。

DBの接続情報を追記する
■MyTestDBContext.csを編集する。
OnConfiguringメソッド内の接続情報は不要なので削除する。
20201108_004_code_01.png

■appsettings.jsonを編集する。
次の様に、接続情報を追加する。
キー名は任意。今回はDB名と同一。
"ConnectionStrings": {
"MyTestDB": "Data Source=localhost\\SQLEXPRESS;Initial Catalog=MyTestDB;User ID=****;Password=****"
}
20201108_004_code_02.png

■Startup.csを編集する。
ファイル冒頭に参照を追加する。
using Microsoft.EntityFrameworkCore;
using MyWebApp.DbContexts;
ConfigureServicesメソッドに、以下のコードを張り付ける。 キー名はappsettings.jsonで指定したものに書き換える。
services.AddDbContext<MyTestDBContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("MyTestDB")));
20201108_004_code_03.png
ここまででDB接続の下準備は終わりです。

コントローラ、ビューを編集する
ここからは各コントローラ、ビューを編集し、DBからデータを取得、表示します。

■Controllers\HomeController.csを編集する。
ファイル冒頭に参照を追加する。
using MyWebApp.DbContexts;
_context変数の宣言をする。
また、既存のコンストラクタに引数を追加し、コンテキストを受け取るようにする。
これにより、このコントローラ内では_contextを使用してDBへアクセスできるようになる。

編集後のコードは次の様になる。
private readonly ILogger<HomeController> _logger;
private readonly MyTestDBContext _context; // 追加

public HomeController(ILogger<HomeController> logger, MyTestDBContext context /*追加*/)
{
_logger = logger;
_context = context; // 追加
}
20201108_004_code_04.png

Indexアクションを編集する。
次のコードを追加し、UserTableからデータを取得する。
var item = _context.UserTable.FirstOrDefault();
if (item != null)
{
ViewBag.mydata = item.Name;
}
20201108_004_code_06.png

■Views\Home\Index.cshtmlを編集する。
Indexアクションを次の様に書き換え、データを表示する。
<h1>こんにちは@(ViewBag.mydata)さん</h1>
20201108_004_code_05.png

デバッグ実行
ブラウザでデータの取得・表示が確認できる。
20201108_005_disp_01.png


参考サイト
posted by Hiro at 20:00| Comment(0) | プログラム