ラベル EXCEL の投稿を表示しています。 すべての投稿を表示
ラベル EXCEL の投稿を表示しています。 すべての投稿を表示

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年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
'---------------------------------------
↑これも、配列でないと出来ない何かしらの処理をして、一気にセルに格納すれば、いいかもしれない。






 

2012年2月23日木曜日

[EXCELVBA]セルの内容を2次元配列に格納(逆もしかり)

これ知ってると大分コードがシンプルになった。

(参考元)
http://kazemati.blogspot.com/2008/09/vba.html


'-------------------------------------------------------
'セルの内容を2次元配列に格納(要素1~で作られるみたい。)
Dim ArrayTEST As Variant: ArrayTEST = ThisWorkSheet.Range("N1:N5")

For j = 0 To UBound( ArrayTEST  ) - 1
     MsgBox (ArrayTEST(j + 1, 1))
Next


'逆に、配列の内容をセルに一気に入れることも可能。
ThisWorkSheet.Range("A1:A5") = ArrayTEST
'-------------------------------------------------------




今まで知らなくて後悔…!!





2012年2月22日水曜日

[EXCELVBA]コピーインサート



with TestSheet

                .Rows(3).Copy
                .Rows(2).Select
                Selection.Insert Shift:=xlDown

    end with


[EXCELVBA]シートをコピーして新しいシートを作成する


関数にしました。

'*******************************************************************************
'   コピーして新しいシートを作る
'   コピー先、コピー元,コピー場所
'*******************************************************************************
 Sub NewSheet(Name, Name2, Optional ByRef setNo = 1)
 
    Dim i, cnt As Integer
    Dim Existsheet

    g_WBK.Activate
    g_WBK.Sheets(Name2).Visible = True
    g_WBK.Sheets(Name2).Select
    g_WBK.Sheets(1).Activate
    g_WBK.Sheets(Name2).Copy after:=g_WBK.Sheets(setNo)
    g_WBK.ActiveSheet.Name = Name

End Sub

2012年2月15日水曜日

[VBAマクロ]テキストファイルを吐き出す。


現在の時刻の名前でテキストファイルを吐き出します。
エラーログ等で使用します。


    'ログの書き出し---------------------------
    Dim strFilePath As String
    Dim intFileNo As Integer
    Dim strData As String
    strFilePath = "D:\TEST" & "_" & Format(Now, "mmddhhnnss") & ".txt"
    intFileNo = FreeFile
    Open strFilePath For Output As #intFileNo
    Print #intFileNo, StrLog
    Close intFileNo



テキスト マクロ txt FO 

[EXCELVBA]一番下の行を求める。

よく忘れるので…

色々あるので使い分けたりしてます。

※A列を基準にする場合


LastGyo = ThisWorkbook.WorkSheets("Sheet1").Range("A" & "65536").End(xlUp).Row + 1




ラスト、最終行、使用している、マクロ

[ACCESS→SQLServer]エクセルでACCCESSのテーブル、リンク構成の一覧を求める


ACCESS→SQLServer変換の際に
ACCESSのデータテーブル一覧、リンク先を一斉チェックする必要があったので作成。  
エクセルで実行して出力します。

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

Private Sub CHKACCESS()

'参照設定でMicrosoft DAO 3.6 Object Library にチェックを入れておいて下さい。
 
    Dim WB As Workbook
    Set WB = ThisWorkbook
    Dim WS As Worksheet
    Set WS = WB.Worksheets("Sheet1")
    Dim StartGyo As Integer: StartGyo = 5         
 
    'ACCESS指定
    Dim strAdd as String; strAdd = "D:\TEST"
    Dim strFile as String; strFile = "test.mdb"
    Dim strChkFile As String: strChkFile = strAdd & "\" & strFile
    Dim db As DAO.Database, tb As DAO.TableDef
    Set db = DBEngine.OpenDatabase(strChkFile, False, True)
     
    Dim No As Integer: No = 1
    For Each tb In db.TableDefs
        If Left(tb.Name, 4) <> "MSys" Then
            WS.Cells(StartGyo, StartRetu - 2) = Now
            WS.Cells(StartGyo, StartRetu - 1) = db.Name
            WS.Cells(StartGyo, StartRetu) = No
            WS.Cells(StartGyo, StartRetu + 1) = tb.Name
            WS.Cells(StartGyo, StartRetu + 2) = tb.Connect
            WS.Cells(StartGyo, StartRetu + 3) = tb.SourceTableName
            No = No + 1
            StartGyo = StartGyo + 1
        End If
    Next tb


    db.Close
 
    MsgBox "OK"


End Sub


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



ACCESSからSQLServer 変換 移行 VBA  マクロ