TimberLandChapel's Tech Blog

TimberLandChapel provide Tips, tech note and scribbling.
Updated my site as English site for APAC users.
TLC.com .Metrix 4.0 Beta1 released

サイトの日本語化方法はこちら

Syndication

News

INETAJ

情報処理関係官公庁

SQL Server

TLC.com

Microsoft

クリエイティブ・コモンズ

http://www3.clustrmaps.com/

10月 2007 - Posts

所有者のないデータベースでのエラー

Adventure Works サンプルデータベースを以下の記事で公開していたスクリプトを使用して次の条件下でアタッチすると所有権の明示的に指定されていないデータベースが出来上がる場合があります。

この問題は [SQL Server 認証] を使用している場合や,Windows アカウントに対応する [ログイン] を明示的に作成している場合は発生しません。

  • Windows 認証で SQL Server にログインしている
  • Windows 認証に使用しているアカウントが OS の Administrator 権限を有する
  • Windows 認証で使用しているアカウントに対応する [ログイン] を SQL Server 上の [セキュリティ] > [ログイン] に作成していない

この場合,データベースに所有者が指定されていないために [データベースダイアグラム] などの一部の機能を利用できずにエラーが発生します。

AdventureWorks サンプルデータベースのセットアップスクリプト
http://blogs.timberlandchapel.com/blogs/timberlandchapel/pages/1141.aspx

次の画像は,データベースのプロパティから [ファイル] を表示した画面です。
所有者の欄が指定されていないことがわかります。

問題の修正

この問題を回避するためには,以下のうちいずれかを行ってください。

対策1:既にアタッチしたデータベースを修正する場合
  • [セキュリティ] > [ログイン] にて,使用する Windows アカウントに対応する [ログイン] を作成する
  • データベースのプロパティの [ファイル] にて,[所有者] に作成した [ログイン] を割り当てる
対策2:データベースのアタッチを最初からやり直す場合
  • [セキュリティ] > [ログイン] にて,使用する Windows アカウントに対応する [ログイン] を作成する
  • 作成した [ログイン] でデータベースにログインし直して,スクリプトを実行する

いずれの対策についても,
目的はデータベースに [所有者] を設定することで,
そのためにWindows アカウントに対応する [ログイン] を作成しています。

サンプルデータベースの公開場所の変更

今まで [Microsoft ダウンロードセンター] から入手することのできた SQL Server 2005 のサンプルデータベースの公開場所が変更になっているます。

以前までの公開場所
http://www.microsoft.com/downloads/details.aspx?FamilyID=e719ecf7-9f46-4312-af89-6ad8702e4e6e&DisplayLang=en

現在はこのダウンロードページでは,サンプルデータベースの新しい公開先を示す PDF ファイルに置き換えられています。

Codeplex

SQL Server 2005 サンプルデータベースは,現在は [Codeplex] にて公開されています。
Codeplex は Microsoft が運営する共有ソースまたはオープンソース・プロジェクトのためのコミュニティ開発サイトです。
SQL Server 2005 サンプルデータベースは,[SQL Server Samples and Community Project] の一部として公開されています。

SQL Server Samples and Community Project
http://codeplex.com/SqlServerSamples

このうち [Adventure Works] サンプルデータベースは,2008 CTP 用のものと,従来の 2005 用のものの2つのリリースが公開されています。

SQL Server 2008 July 2007 CTP 向け
http://www.codeplex.com/MSFTDBProdSamples/Release/ProjectReleases.aspx?ReleaseId=5705
SQL Server 2005 SP2 向け
http://www.codeplex.com/MSFTDBProdSamples/Release/ProjectReleases.aspx?ReleaseId=4004

Codeplex で現在公開されている msi ファイルと,以前ダウンロードセンターで公開されていたものの MD5 ハッシュ値は異なっています。
詳細な内容の相違に関するリリースノートはいまのところ確認できていません。

また,Codeplex 上の [Source Code] ページには CSV ファイル形式のデータも公開されているようです。

シナリオと要件
VB.NET から Excel の COM オブジェクトを操作する場合の注意点
http://blogs.timberlandchapel.com/blogs/timberlandchapel/articles/1149.aspx
で紹介したように,VB.NET から Excel の COM オブジェクトを操作する際には,.NET のマネージコードから COM を操作するための一風変わった作法が必要になります。

今回は,Excel のブックに罫線を描画する方法を紹介します。

Excel ブックを開いて,罫線を描画する

前回の「Excel COM オブジェクトを正しく解放するためのコツ」で紹介した4つのコツを頭に入れて丁寧にコードを書きます。

また,Excel の罫線は次の6つのパーツの組み合わせとして作成することになります。

  • 上端線
  • 下端線
  • 右端線
  • 左端線
  • 内部水平線
  • 内部垂直線

罫線の描画に関しても,[Borders] コレクションと [Border] オブジェクトが関わるため,一旦 [Borders] コレクションの参照を作成する必要があります。

罫線を描画する
Dim targetRange As Excel.Range = Nothing
Dim targetBorders As Excel.Borders = Nothing
Dim targetRightBorder As Excel.Border = Nothing
Dim targetLeftBorder As Excel.Border = Nothing
Dim targetTopBorder As Excel.Border = Nothing
Dim targetBottomBorder As Excel.Border = Nothing
Dim targetVerticalBorder As Excel.Border = Nothing
Dim targetHorizontalBorder As Excel.Border = Nothing
 
Try
    targetRange = [worksheet].Range("A3:C5")
 
    targetBorders = targetRange.Borders
    targetRightBorder = targetBorders.Item(Excel.XlBordersIndex.xlEdgeRight)
    targetLeftBorder = targetBorders.Item(Excel.XlBordersIndex.xlEdgeLeft)
    targetTopBorder = targetBorders.Item(Excel.XlBordersIndex.xlEdgeTop)
    targetBottomBorder = targetBorders.Item(Excel.XlBordersIndex.xlEdgeBottom)
    targetVerticalBorder = targetBorders.Item(Excel.XlBordersIndex.xlInsideVertical)
    targetHorizontalBorder = targetBorders.Item(Excel.XlBordersIndex.xlInsideHorizontal)
 
    With targetRightBorder
        .LineStyle = Excel.XlLineStyle.xlContinuous
        .Weight = Excel.XlBorderWeight.xlThin
        .ColorIndex = Excel.XlColorIndex.xlColorIndexAutomatic
    End With
    With targetLeftBorder
        .LineStyle = Excel.XlLineStyle.xlContinuous
        .Weight = Excel.XlBorderWeight.xlThin
        .ColorIndex = Excel.XlColorIndex.xlColorIndexAutomatic
    End With
    With targetTopBorder
        .LineStyle = Excel.XlLineStyle.xlContinuous
        .Weight = Excel.XlBorderWeight.xlThin
        .ColorIndex = Excel.XlColorIndex.xlColorIndexAutomatic
    End With
    With targetBottomBorder
        .LineStyle = Excel.XlLineStyle.xlContinuous
        .Weight = Excel.XlBorderWeight.xlThin
        .ColorIndex = Excel.XlColorIndex.xlColorIndexAutomatic
    End With
    With targetVerticalBorder
        .LineStyle = Excel.XlLineStyle.xlContinuous
        .Weight = Excel.XlBorderWeight.xlHairline
        .ColorIndex = Excel.XlColorIndex.xlColorIndexAutomatic
    End With
    With targetHorizontalBorder
        .LineStyle = Excel.XlLineStyle.xlContinuous
        .Weight = Excel.XlBorderWeight.xlHairline
        .ColorIndex = Excel.XlColorIndex.xlColorIndexAutomatic
    End With
 
Finally
    If Not targetHorizontalBorder Is Nothing Then
        Marshal.ReleaseComObject(targetVerticalBorder)
    End If
    If Not targetVerticalBorder Is Nothing Then
        Marshal.ReleaseComObject(targetVerticalBorder)
    End If
    If Not targetBottomBorder Is Nothing Then
        Marshal.ReleaseComObject(targetBottomBorder)
    End If
    If Not targetTopBorder Is Nothing Then
        Marshal.ReleaseComObject(targetTopBorder)
    End If
    If Not targetLeftBorder Is Nothing Then
        Marshal.ReleaseComObject(targetLeftBorder)
    End If
    If Not targetRightBorder Is Nothing Then
        Marshal.ReleaseComObject(targetRightBorder)
    End If
    If Not targetBorders Is Nothing Then
        Marshal.ReleaseComObject(targetBorders)
    End If
    If Not targetRange Is Nothing Then
        Marshal.ReleaseComObject(targetRange)
    End If
End Try

コード中の [worksheet] 部分には,[worksheet] オブジェクトの参照を指定してください。

それぞれの [Border] オブジェクトに対して,[LineStyle],[Weight],[ColorIndex] の3つのプロパティを指定することで基本的な罫線を描画することができます。

好みの罫線を描画するためには Excel の [マクロの記録] 機能を利用して VBA コード内にプロパティの値を記録させるとよいでしょう。

罫線を消去する

罫線を描画する操作を行えば,当然罫線を消去する操作も行う必要が出てくるでしょう。

[LineStyle] プロパティに指定する [XlLineStyle] 列挙体に,値 [xlLineStyleNone] が存在しますが,これは罫線の指定をしないことにはなりません。

罫線の指定を解除するためには [Constants] 列挙体の 値 [xlNone] を指定します。

罫線を解除する
targetBorder.LineStyle = Excel.Constants.xlNone

これで罫線の指定を解除することができます。

written by TimberLandChapel
Posted by timberlandchapel | with no comments