ラベル VBAマクロ の投稿を表示しています。 すべての投稿を表示
ラベル VBAマクロ の投稿を表示しています。 すべての投稿を表示

2015年6月17日水曜日

[その他]SQLServerとExcelマクロを使ってリバースER図を作成する。(エンティティのみ)

①まずは以下のSQL文を↓SQLServer上指定のDB上にて実行しましょう

SELECT
object_name(sys.columns.object_id),
sys.columns.column_id,
sys.columns.name,
sys.indexes.name AS INDEX_NAME,
sys.indexes.is_primary_key AS TEST

FROM
sys.columns inner join sys.objects on
sys.columns.object_id = sys.objects.object_id


LEFT JOIN
sys.index_columns
on sys.columns.column_id = sys.index_columns.column_id
and sys.columns.object_id = sys.index_columns.object_id

LEFT JOIN sys.indexes
on sys.indexes.object_id = sys.index_columns.object_id

where

ISNULL(sys.indexes.is_primary_key ,-1) IN (-1,1)
and
sys.objects.type = 'U'

--もしER図に出したくないカラムがある場合はここで指定
--and
--sys.columns.name NOT IN ( --'created',
--'テスト項目',
--'削除フラグ'
--)


--テーブルしぼるならここで!
--and
--LEFT(object_name(sys.columns.object_id),8) IN (
--'T_氏名'
--'T_給与'
--)


order by
object_name(sys.columns.object_id),
column_id


②出力された結果をエクセルに貼り付けて以下の様にします
 (必ずA1セルから貼り付けてください)


③貼り付けたシート上で以下のVBAマクロを実行します。

Dim WB As Workbook
Set WB = ActiveWorkbook
Dim WS1 As Worksheet
Set WS1 = WB.ActiveSheet

WS1.Select
Range("A1:E1").Select
Range(Selection, Selection.End(xlDown)).Select

'--------------------------------------------------------
'実行速度向上のため画面更新と自動計算を停止
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
'-----------------------------------------------------------

'現在選択しているセルの取得
Dim intStartGyo As Integer: intStartGyo = Selection.Row
Dim intLastGyo As Integer: intLastGyo = Selection.Row + Selection.Rows.Count - 1
Dim intStartClm As Integer: intStartClm = Selection.Column
Dim intLastClm As Integer: intLastClm = Selection.Column + Selection.Columns.Count - 1

'※初期置
Dim Rng As Range
Set Rng = WS1.Cells(intStartGyo, intStartClm)


Dim lWidth As Long: lWidth = 150 'エンティティオブジェクトのサイズ
Dim lHeight As Long: lHeight = 14 'エンティティオブジェクトのサイズ

lLeft = Rng.Left + 350 '初期位置
Ltop = Rng.Top + 10 '初期位置

Dim TblCnt As Integer: TblCnt = 0
Dim TblTitle As String
Dim TblStartTop As Integer
Dim ECnt As Integer
Dim strShapes As String
Dim FlgKey As Boolean

For j = intStartGyo To intLastGyo

'テーブルカウント
If TblTitle <> WS1.Cells(j, intStartClm).Text Then
TblCnt = TblCnt + 1
TblTitle = WS1.Cells(j, intStartClm).Text
ECnt = 0
strShapes = ""
Ltop = WS1.Cells(j + 1, intStartClm).Top + 10
TblStartTop = Ltop
FlgKey = True
End If

'エンティティの作成---------------------------------------

Dim myShape1 As Shape

'主キーからそうでなくなった場合、線を足す
If WS1.Cells(j, intStartClm + 4).Text <> "1" Then
If FlgKey = True Then
Dim SShape As Shape
Set SShape = WS1.Shapes.AddConnector(msoConnectorStraight, lLeft, Ltop, lLeft + lWidth, Ltop)
strShapes = strShapes & "," & SShape.Name
FlgKey = False
End If
End If


Dim oShape As Shape
Set oShape = WS1.Shapes.AddShape(msoShapeRectangle, lLeft, Ltop, lWidth, lHeight)
With oShape
.Fill.Visible = msoFalse
.Fill.Solid 'グラデーション等無し
.Line.Visible = msoFalse
.TextFrame.Characters.Font.Color = vbBlack
If WS1.Cells(j, intStartClm + 4).Text <> "1" Then
.TextFrame.Characters.Text = WS1.Cells(j, intStartClm + 2).Text
Else
.TextFrame.Characters.Text = "■" & WS1.Cells(j, intStartClm + 2).Text
End If
.TextFrame.Characters.Font.Size = 8
.TextFrame.HorizontalAlignment = xlHAlignLeft
End With
strShapes = strShapes & "," & oShape.Name


'追加位置を下へずらす
Ltop = Ltop + lHeight
ECnt = ECnt + 1
'-------------------------------------------------------

'次が異なるテーブルor終了行---------------------------------
If Len(strShapes) > 0 Then
If WS1.Cells(j + 1, intStartClm).Text <> TblTitle Or j + 1 > intLastGyo Then


Set oShape = WS1.Shapes.AddShape(msoShapeRectangle, lLeft, TblStartTop - 20, lWidth, 30 + ECnt * (lHeight + 1))
With oShape
.Fill.Visible = msoFalse
.Fill.Solid 'グラデーション等無し
.Line.Visible = msoTrue
.TextFrame.Characters.Font.Color = vbBlue
.TextFrame.Characters.Text = TblTitle
.TextFrame.Characters.Font.Size = 8
.TextFrame.HorizontalAlignment = xlHAlignLeft
End With
'strShapes(ECnt) = oShape.Name
'ActiveSheet.Shapes.Range(Array("""" & oShape.Name & """" & strShapes)).Select
strShapes = strShapes & "," & oShape.Name


Dim valShapes() As String
valShapes = Split(strShapes, ",")


'oShape.Select
'Selection.ShapeRange.Group.Select
WS1.Shapes.Range(valShapes).Group

'追加位置を右へずらす
'lLeft = lLeft + lWidth + 5
'追加位置を下へずらす
Ltop = Ltop + 30 + ECnt * (lHeight + 1) + 10

End If
End If
'------------------------------------------------------------

Next

'実行速度向上のため画面更新と自動計算を再開---------------
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
'-----------------------------------------------------------

MsgBox ("作成成功")



End Sub


④以下の様にER図用のエンティティ図形が出来ます。

2015年6月3日水曜日

[その他]MK-2からコピーしたスキーマ情報からER図用のエンティティオブジェクトを作成するマクロ

Sub MR2ERtoExcelER()

 
    MsgBox "※変換したい情報を全部選択しておく必要があります※"

    Dim WB As Workbook
    Set WB = ActiveWorkbook
    Dim WS1 As Worksheet
    Set WS1 = WB.ActiveSheet
 
    '--------------------------------------------------------
    '実行速度向上のため画面更新と自動計算を停止
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    '-----------------------------------------------------------

    '現在選択しているセルの取得
    Dim intStartGyo As Integer: intStartGyo = Selection.Row
    Dim intLastGyo As Integer: intLastGyo = Selection.Row + Selection.Rows.Count - 1
    Dim intStartClm As Integer: intStartClm = Selection.Column
    Dim intLastClm As Integer: intLastClm = Selection.Column + Selection.Columns.Count - 1
 
    '※初期置
    Dim Rng As Range
    Set Rng = WS1.Cells(intStartGyo, intStartClm)
 
 
    Dim lWidth As Long: lWidth = 150  'エンティティオブジェクトのサイズ
    Dim lHeight  As Long: lHeight = 14  'エンティティオブジェクトのサイズ

    lLeft = Rng.Left + 350 '初期位置
    Ltop = Rng.Top + 10 '初期位置
 
    Dim TblCnt As Integer: TblCnt = 0
    Dim TblTitle As String
    Dim TblStartTop As Integer
    Dim ECnt As Integer
    Dim strShapes As String
    Dim FlgKey As Boolean
 
    For j = intStartGyo To intLastGyo
               
            'テーブルカウント
            If WS1.Cells(j, intStartClm).Text = "[Entity]" Then
                TblCnt = TblCnt + 1
                TblTitle = Replace(WS1.Cells(j + 1, intStartClm).Text, "PName=", "")
                ECnt = 0
                strShapes = ""
                Ltop = WS1.Cells(j + 1, intStartClm).Top + 10
                TblStartTop = Ltop
                FlgKey = True
            End If
                                           
            'エンティティの作成---------------------------------------
            If Left(WS1.Cells(j, intStartClm).Text, 6) = "Field=" Then
         
              Dim myShape1 As Shape
              Dim strText() As String
              strText = Split(WS1.Cells(j, intStartClm).Text, ",")
           
           
                '主キーからそうでなくなった場合、線を足す
                If strText(4) = "" Then
                    If FlgKey = True Then
                        Dim SShape As Shape
                        Set SShape = WS1.Shapes.AddConnector(msoConnectorStraight, lLeft, Ltop, lLeft + lWidth, Ltop)
                        strShapes = strShapes & "," & SShape.Name
                        FlgKey = False
                    End If
                End If
           
           
              Dim oShape As Shape
              Set oShape = WS1.Shapes.AddShape(msoShapeRectangle, lLeft, Ltop, lWidth, lHeight)
              With oShape
                .Fill.Visible = msoFalse
                .Fill.Solid 'グラデーション等無し
                .Line.Visible = msoFalse
                .TextFrame.Characters.Font.Color = vbBlack
                If strText(4) = "" Then
                    .TextFrame.Characters.Text = Replace(strText(1), """", "")
                Else
                    .TextFrame.Characters.Text = "■" & Replace(strText(1), """", "")
                End If
                .TextFrame.Characters.Font.Size = 8
                .TextFrame.HorizontalAlignment = xlHAlignLeft
              End With
              strShapes = strShapes & "," & oShape.Name
           
           
              '追加位置を下へずらす
              Ltop = Ltop + lHeight
              ECnt = ECnt + 1
            End If
            '-------------------------------------------------------
               
            '次が異なるテーブルor終了行---------------------------------
            If Len(strShapes) > 0 Then
            If WS1.Cells(j + 1, intStartClm).Text = "[Entity]" Or j + 1 = intLastGyo Then
           
               
              Set oShape = WS1.Shapes.AddShape(msoShapeRectangle, lLeft, TblStartTop - 20, lWidth, 30 + ECnt * (lHeight + 1))
              With oShape
                .Fill.Visible = msoFalse
                .Fill.Solid 'グラデーション等無し
                .Line.Visible = msoTrue
                .TextFrame.Characters.Font.Color = vbBlue
                .TextFrame.Characters.Text = TblTitle
                .TextFrame.Characters.Font.Size = 8
                .TextFrame.HorizontalAlignment = xlHAlignLeft
              End With
              'strShapes(ECnt) = oShape.Name
              'ActiveSheet.Shapes.Range(Array("""" & oShape.Name & """" & strShapes)).Select
              strShapes = strShapes & "," & oShape.Name
           
           
              Dim valShapes() As String
              valShapes = Split(strShapes, ",")
         
           
              'oShape.Select
              'Selection.ShapeRange.Group.Select
              WS1.Shapes.Range(valShapes).Group
               
                 '追加位置を右へずらす
                'lLeft = lLeft + lWidth + 5
                '追加位置を下へずらす
                Ltop = Ltop + 30 + ECnt * (lHeight + 1) + 10
         
            End If
            End If
            '------------------------------------------------------------
 
    Next

    '実行速度向上のため画面更新と自動計算を再開---------------
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    '-----------------------------------------------------------


End Sub






2015年2月9日月曜日

[VBA]選択しているセルを図形オブジェクトに一発変換するマクロ

フローや機能要件を作成するときに
一度Excelのセルに打ったものを一気に図形オブジェクトに変換したい時用マクロ。


例)これを

          ↓

一発でこんな感じに。

----------------------------------------------------------------
Private Sub MakeObject()


    Dim WB As Workbook
    Set WB = ThisWorkbook
    Dim WS1 As Worksheet
    Set WS1 = WB.ActiveSheet
 
    '--------------------------------------------------------
    '実行速度向上のため画面更新と自動計算を停止
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    '-----------------------------------------------------------

    '現在選択しているセルの取得
    Dim intStartGyo As Integer: intStartGyo = Selection.Row
    Dim intLastGyo As Integer: intLastGyo = Selection.Row + Selection.Rows.Count - 1
    Dim intStartRow As Integer: intStartRow = Selection.Column
    Dim intLastRow As Integer: intLastRow = Selection.Column + Selection.Columns.Count - 1
 
    '※初期置
    Dim Rng As Range
    Set Rng = WS1.Cells(intStartGyo, intStartRow)
 
    Dim lWidth As Long: lWidth = 100  'オブジェクトのサイズ
    Dim lHeight  As Long: lHeight = 20  'オブジェクトのサイズ

 
    lLeft = Rng.Left + 10
    For i = intStartGyo To intLastGyo
   
        lTop = Rng.Top
        For j = intStartRow To intLastRow
         
            'If Len(WS1.cells(i, j).Text) > 0 And WS1.cells(i, j).Text > 0 Then '空欄なら作らない
                       
              '図形の作成---------------------------------------
              Dim myShape1 As Shape
              Dim strText As String
              strText = WS1.Cells(i, j).Text
              Set myShape1 = WS1.Shapes.AddShape( _
                    Type:=msoShapeRectangle, _
                    Left:=lLeft, _
                    Top:=lTop, _
                    Width:=lWidth, _
                    Height:=lHeight)
                With myShape1
                    .Fill.Visible = msoTrue
                    .Fill.Solid
                    .TextFrame.Characters.Text = strText
                    .TextFrame.HorizontalAlignment = xlCenter
                End With
              '-------------------------------------------------------
         
              '追加位置を下へずらす
              lTop = lTop + lHeight + 5
           
            'End If
     
            Next

       '追加位置を右へずらす

       lLeft = lLeft + lWidth + 5
 
    Next

    '実行速度向上のため画面更新と自動計算を再開---------------
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    '-----------------------------------------------------------


End Sub

2012年8月20日月曜日

[VBA]ExcelVBAでWebサービスを読む。


----------------------------------------------------------
ExcelでWebサービスを読む方法。(SOAP方式。ASP.NETで作成。)
----------------------------------------------------------

①Excel2003の場合は、「Web Service Toolkit」をダウンロード+インストールしておくとよい。
  2003じゃなくてももし完成後に文字化けするようであれば、それはSOAP3.0入手のためダウンロードした方がいいとか悪いとか。


②既存の[ツール]→[参照設定]→「Microsoft SOAP Type Library」にチェックをいれて、SOAPのコードをいじれるようにしておく。


③「MyWebService」というクラスを作成してソースを以下の様にします。赤文字の追記を参照のこと。
========================================================================

Private MyWebService As SoapClient30
Private Const c_WSDL_URL As String = "http://●●●.asmx?wsdl"
Private Const c_SERVICE As String = "●●●●"
Private Const c_PORT As String = "●●●●" '※上記アドレスをブラウザで直接見ればPortやService名,Namespaceは書いてあります。
Private Const c_SERVICE_NAMESPACE As String = "http://●●●●/"
Private Sub Class_Initialize()
'*****************************************************************
'クラスがインスタンス化されるたびに、このサブルーチンが呼び出されます。
'変数 sc_ComplexTypes に SoapClient30 を割り当てます。
'*****************************************************************
Dim str_WSML As String
str_WSML = ""
Set MyWebService = New SoapClient30
MyWebService.MSSoapInit2 c_WSDL_URL, str_WSML, c_SERVICE, c_PORT, c_SERVICE_NAMESPACE
'ProxyServer を <CURRENT_USER> に設定し、Internet Explorer の LAN 設定で定義されている
'プロキシ サーバーを使用します。
MyWebService.ConnectorProperty("ProxyServer") = "<CURRENT_USER>"
'Internet Explorer が自動検出に設定されている場合、EnableAutoProxy を True に設定して、
'プロキシ設定を自動検出するようにします。
MyWebService.ConnectorProperty("EnableAutoProxy") = True

End Sub
Private Sub Class_Terminate()
'*****************************************************************
'クラスが消滅するたびに、このサブルーチンが呼び出されます。
'変数 sc_ComplexTypes を Nothing に設定します。
'*****************************************************************
'エラー処理
On Error GoTo Class_TerminateTrap
Set MyWebService = Nothing
Exit Sub
Class_TerminateTrap:
WSRefScrCommonErrorHandler ("Class_Terminate")
End Sub
Private Sub WSRefScrCommonErrorHandler(str_Function As String)
'*****************************************************************
'このサブルーチンは、クラス エラー処理ルーチンです。
'サブルーチン、または関数でエラーが発生したときに呼び出されます。
'エラーが発生したサブルーチン名、または関数名とエラー内容を返します。
'*****************************************************************
' SOAP  エラー
If MyWebService.FaultCode <> "" Then
Err.Raise vbObjectError, str_Function, MyWebService.FaultString
' SOAP  以外のエラー
Else
Err.Raise Err.Number, str_Function, Err.Description
End If
End Sub
'=====================================================================
'↓↓使用する関数の宣言は以下に追加していきます↓↓
'=====================================================================
'例①:文字列(String)を投げて、文字列(String)で結果が返ってくる関数
 Public Function wsm_ExecuteScalar(ByVal str_SQL As String) As String
'エラー処理
On Error GoTo wsm_ExecuteScalarTrap
wsm_ExecuteScalar = MyWebService.ExecuteScalar(str_SQL)
Exit Function
wsm_ExecuteScalarTrap:
WSRefScrCommonErrorHandler "wsm_ExecuteScalar"
End Function

'例②:文字列(String)を投げて、データテーブル型で結果が返ってくる関数の場合は、DOMNodeListで宣言する!
Public Function wsm_GetDataTable(ByVal str_SQL As String) As MSXML2.IXMLDOMNodeList
'*****************************************************************
'"wsm_GetDataTable" は XML として定義されています。XML 変数の実装に関する詳細については、
'Microsoft Office 2003 Web Services Toolkit 2.0 ヘルプの「複合型 : XML」を参照してください。
'*****************************************************************
'エラー処理
On Error GoTo wsm_GetDataTableTrap
Set wsm_GetDataTable = MyWebService.GetDataTable(str_SQL)
Exit Function
wsm_GetDataTableTrap:
WSRefScrCommonErrorHandler "wsm_GetDataTable"
End Function
'=====================================================================
'↑↑使用する関数の宣言は以下に追加していきます↑↑
'=====================================================================

========================================================================
④作ったクラスを利用して、コードはこのように書きます。
========================================================================

Dim mySQL As String
mySQL = " SELECT * FROM 社員テーブル"
'Webサービスから
Dim MyWebService As New MyWebService
Dim Nodes As MSXML2.IXMLDOMNodeList
Set Nodes = MyWebService.wsm_GetDataTable(mySQL)

'中身確認したい場合は
'For i = 0 To Nodes.Length - 1
' MsgBox i & "=>" & vbCrLf & Nodes(i).nodeName & "=>" & vbCrLf & Nodes(i).Text
' Nodes.NextNode
'Next


Dim xNode As MSXML2.IXMLDOMNode
Set xNode = Nodes(1) 'Nodes(0)はヘッダー情報ぽいのでNodes(1)だけでOk
Dim NodeList As MSXML2.IXMLDOMNodeList
Set NodeList = xNode.selectNodes("NewDataSet/tmp") '←Node名はWebサービスによって変わる!あらかじめブラウザで結果を確認した方がヨイ

If NodeList.Length = 0 Then
 MsgBox ("対象データはありません")
 GoTo EndStep
End If


For Each obj In NodeList
'ここでセルに自由に加工する
With obj

Dim strMoji(16) As Variant
strMoji(0) = .childNodes(0).Text
strMoji(1) = .childNodes(1).Text
WS.Range(WS.Cells(intRow, 1), WS.Cells(intRow, 16)).Value = strMoji
End With

intRow = intRow + 1
Next

======================================================================== 

2012年3月1日木曜日

[EXCELVBA]Web Service ToolkitによるVBA→Webサービス参照

From Evernote:

[EXCELVBA]Web Service ToolkitによるVBA→Webサービス参照

Web Service Toolkit を使うと 
ExcelVBA→Webサービスを参照できるようになります。

■実装方法

①Web Service Toolkitをダウンロード


②インストールが完了すると
Visual Basic Editorのメニューに「Web Service References」が追加されます。

この「Web Service References」から表示されるダイアログの「Web サービス URL」にwsdlを入力すると
   soap clientクラスが生成されます!

     ※WSDL…Webサービスアドレス+"?wsdl"
     (Webサービスのためのインターフェイス記述言語)

 


③クラスが出来ました。

  

     
     ②-1.例えば、Webサービスからこんなクラスが自動生成されたとして…
     '-----------------------------------------------------------------
Public Function wsm_ExecuteScalar(ByVal str_Sql As String) As String
    '*****************************************************************
    'http://*****/******/*******.asmx?wsdl から作成されたプロキシ関数です。
    '*****************************************************************

    'エラー処理
    On Error GoTo wsm_ExecuteScalarTrap

    wsm_ExecuteScalar = sc_WSCommon.ExecuteScalar(str_Sql)

Exit Function
wsm_ExecuteScalarTrap:
    WSCommonErrorHandler "wsm_ExecuteScalar"
End Function
     '-----------------------------------------------------------------


     ②-2.このクラスを使った読み方はこんなコードとなります↓。

     '-----------------------------------------------------------------
Private Sub CommandButton1_Click()

On Error GoTo errhand

    Dim SimeiC As Long
    SimeiC = ThisWorkbook.Sheets("Sheet1").Range("C3").Value

    ThisWorkbook.Sheets("sheet1").Range("E4") = ""

    Dim clsws_WSCommon As New clsws_WSCommon 'Soap Client
    Dim results As String
    results = clsws_WSCommon.wsm_ExecuteScalar("SELECT 氏名 FROM T_個人情報 WHERE 氏名コード= '" & SimeiC & "'")
       
    ThisWorkbook.Sheets("sheet1").Range("E4") = results
   
   
    Exit Sub


errhand:
    MsgBox "Error #" + Err.Number + ": " + Err.Description

End Sub
      '-----------------------------------------------------------------


②-3.ちなみに受け渡しがDataTable変数(.NET)のクラスの場合はどうなるか…
'-----------------------------------------------------------------
Public Sub wsm_AddDataTable2(ByRef any_Tbl As MSXML2.IXMLDOMNodeList, ByVal str_TableName As String, ByVal str_Sql As String)
    '*****************************************************************
    'http://*****/******/*******.asmx?wsdl から作成されたプロキシ サブルーチンです。
    '
    '"
any_Tbl" は XML として定義されています。XML 変数の実装に関する詳細については、
    'Microsoft Office 2003 Web Services Toolkit 2.0 ヘルプの「複合型 : XML」を参照してください。
    '*****************************************************************



    'エラー処理
    On Error GoTo wsm_AddDataTable2Trap


    sc_WSCommon.AddDataTable2 any_Tbl, str_TableName, str_Sql


Exit Sub
wsm_AddDataTable2Trap:
    WSCommonErrorHandler "wsm_AddDataTable2"
End Sub
'-----------------------------------------------------------------

②-4.DataTable変数は、IXMLDOMNodeListに変換されています。これは以下のように読みます
'-----------------------------------------------------------------
Private Sub CommandButton2_Click()


On Error GoTo errhand


    Dim JigyobuC As Long
    JigyobuC = ThisWorkbook.Sheets("Sheet1").Range("C6").Value


    Dim clsws_WSCommon As New clsws_WSCommon
   
    Dim strSQL As String
    strSQL = "SELECT 部門コード,部門名 FROM V_部門 WHERE 事業部コード = '" & JigyobuC & "'"
             
    Dim Nodes As MSXML2.IXMLDOMNodeList
    clsws_WSCommon.wsm_AddDataTable2 Nodes, "test", strSQL

       
    Dim y As Integer
    y = 8
   
    Dim xNode As MSXML2.IXMLDOMNode
    For Each xNode In Nodes
        Dim NodeList As MSXML2.IXMLDOMNodeList
        Set NodeList = xNode.selectNodes("NewDataSet/test/部門名")
        For Each obj In NodeList
           'MsgBox obj.nodeName & " : " & obj.Text
           Range("E" & y) = obj.Text
           y = y + 1
        Next
    Next xNode
   
    Exit Sub
       
errhand:
    MsgBox "Error #" + Err.Number + ": " + Err.Description
   
End Sub
'-----------------------------------------------------------------
もはやXMLNodeの勉強。




■基礎知識!




  Web Service ToolkitはWebサービスを使うためのローカルクラスを自動生成するツールに過ぎない。
  あくまでSOAP ToolKit 3.0 を使って接続しているのがポイント。
  (他の端末でもあらかじめSOAPToolkit3.0は入っている??みたいなのでインストール不要)

ちなみにインストールせずに自分でSOAPで読むコードを直接書いてもいいんだけど
どうも既存の[ツール]→[参照設定]→「Microsoft SOAP Type Library」では日本語が文字化けするので
SOAP Toolkit 3.0 ダウンロードついでにOffiece Web Service をインストールして
自動生成することにした訳です。



2012年2月24日金曜日

[EXCELVBA]処理速度を上げる基本

これは絶対必須。

マクロの実行を早くするために以下の処理を行います。

'--------------------------------------------------------
'実行速度向上のため画面更新と自動計算を停止

Application.ScreenUpdating = False
ThisWorkbook.Sheets("選択画面").Cells(1, 1).Select  '※1
ThisWorkbook.Sheets("選択画面").Activate  '※2 
Application.Calculation = xlCalculationManual
'-----------------------------------------------------------

 '実行速度向上のため画面更新と自動計算を再開----
 Application.ScreenUpdating = True
ThisWorkbook.Sheets("選択画面").Cells(1, 1).Select  '※1
ThisWorkbook.Sheets("選択画面").Activate  '※2 
 Application.Calculation = xlCalculationAutomatic
'-----------------------------------------------------------

'※1 はなくてもいいですが、エクセル97はコレがないとエラーになります
'※2 これはエクセルバージョンを問わず必須。

[EXCELVBA]土日かどうか?


         
            dateLoop = .Range("A1")          


            '土日で色を変える
            If Weekday(dateLoop) = vbSunday Or _
              Weekday(dateLoop) = vbSaturday Then
                .Range("A2").Interior.ColorIndex = 36
            End If

           

[EXCELVBA]ADOを使ったデータの処理方法

ADOでデータを読んだ後のレコードセット。
.NETみたいにDataTableとして扱ったり、並び替えたりとか色々したいんだけど
さすがにそうもいかなく、結局ぶん回すことがほとんど。

↓基本の型。
'---------------------------------------
  Dim objADOCON As ADODB.Connection
  Dim objADORS  As  ADODB.Recordset

  Set objADOCON = Application.CurrentProject.Connection
 
Set objADORS = objADOCON.Execute("SELECT * FROM アドレス帳")


  If  objADORS.EOF = True Then
        MsgBox "指定のデータはありませんでした。"
        Exit Sub
  End If

 Do Until objADORS.EOF
         Debug.Print objADORS!氏名
         objADORS.MoveNext
 Loop
  objADORS.Close
  objADOCON.Close

  Set objADORS = Nothing
  Set objADOCON = Nothing
'---------------------------------------


で、
Set objADORS = objADOCON.Execute("SELECT * FROM アドレス帳")
でとってきたレコードセットはぶん回すこと以外
ADOでは何ができるのだろうかと調べてみた。


↓①フィルターがかけられます。
'---------------------------------------
objADORS.Filter = "都道府県 = '広島'"

'解除の際は空欄でOKみたい。
objADORS.Filter = ""

'---------------------------------------



↓②Excel上のセルに一気に表示します。(これ便利!!!)
'---------------------------------------

Range("A1").CopyFromRecordset objADORS

'---------------------------------------


↓③GetRowsを使って配列に格納することができます。
'---------------------------------------
Dim a As Variant
a =  objADORS .GetRows
'---------------------------------------
↑これも、配列でないと出来ない何かしらの処理をして、一気にセルに格納すれば、いいかもしれない。