TopProgramming LanguageVB/VBA > 2014年5月
2014年5月23日

Excel VBAでモジュール名を変更する方法

May 23,2014 1:55 AM
Tag:[, ]
Permalink

Excel VBAでモジュール名を変更する方法を紹介します。

1.問題点

VBAを記述するには、Alt+F11でVBE画面を開き、メニューバーの「挿入」→「標準モジュール」をクリック。

メニューバー

これで標準モジュールの「Module1」が追加されます。

標準モジュール

が、このモジュール名「Module1」の名前の変更方法が分かりません。

「Module1」の部分を右クリックしてもそれらしいメニューは表示されません。

プロジェクトエクスプローラ

ということで、モジュール名を変更する方法を紹介します。

2.モジュール名を変更する

プロジェクトエクスプローラで名前を変更したいモジュールを選択

プロジェクトエクスプローラ

メニューバーの「表示」→「プロパティ ウィンドウ」をクリック。

メニューバー

左下にプロパティウィンドウが表示されます。

プロパティ ウィンドウ

「(オブジェクト名)」の右側に表示されたモジュール名「Module1」の部分をクリックすれば編集することができます。ここでは「test」に書き換えます。

モジュール名

リターンを押下するかマウスカーソルをテキストフィールドからはずせば、プロジェクトエクスプローラに表示されているモジュール名が「test」に変更されます。

プロジェクトエクスプローラ

プロパティウィンドウを閉じるには×印をクリックします。

プロジェクトエクスプローラ

Comments [0] | Trackbacks [0]
2014年5月16日

Excel VBAでセルの選択を判定する方法のまとめ

May 16,2014 2:34 AM
Tag:[, ]
Permalink

Excel VBAでセルの選択を判定する方法をまとめました。

1.はじめに

仕事で、ExcelのB列以降のセル(複数行)にデータを設定したあと、A列に○印などの文字を設定して出力ボタンをクリックすると、その行の内容をCSVで出力するようなVBAを作りました。

が、A列に印をつけるのは一時的なものなので、A列のセルを選択状態にして出力ボタンをクリックすれば、その行の内容をCSVで出力するようにしました。

ということでセルの選択状態を判定する方法を調べましたので、本エントリーでまとめておきます。

前半で選択されたセルの取得方法、後半で選択セルの判定方法を紹介します。

2.セルの行と列を取得する

セルの行と列を取得するには「ActiveCell.Column」および「ActiveCell.Row」を利用します。

Sub sample()
    MsgBox ActiveCell.Column & " " & ActiveCell.Row
End Sub

「ActiveCell.Column」は選択されたセルの列、「ActiveCell.Row」は選択されたセルの行を表示します。

1つのセルを選択した場合、そのセルの行と列を表示します。

複数のセルが選択されている場合、最若番のセルの行と列のみを表示します。

Ctrlキーで複数のセルをばらばらに選択している場合、最後にカーソルがあたっているセルの行と列を表示します。

3.セルの番地を取得する

セルの番地を取得するには「ActiveCell.Address」を利用します。

Sub sample()
    MsgBox ActiveCell.Address(False, False, xlA1)
End Sub

Addressプロパティのパラメータの意味は次のとおりです。

  • 第1パラメータ:行の形式(True:絶対参照形式/False:相対参照形式)
  • 第2パラメータ:列の形式(True:絶対参照形式/False:相対参照形式)
  • 第3パラメータ:セル名の取得形式(xlA1:A1参照形式/xlR1C1:R1C1参照形式)

1つのセルを選択した場合、そのセルの行と列を表示します。

複数のセルが選択されている場合、最若番のセルの行と列のみを表示します。

Ctrlキーで複数のセルをばらばらに選択している場合、最後にカーソルがあたっているセルの行と列を表示します。

4.選択されたすべてのセルの番地を取得する

選択されたすべてのセルの番地を取得するには、Selectionプロパティを利用します。

Sub sample()
    MsgBox Selection.Address(False, False, xlA1)
End Sub

複数選択の場合、その一番上のセルと一番下のセルの番地を表示します。

選択範囲が矩形の場合、左上と右下の番地を表示します。

Ctrlキーで複数のセルをばらばらに選択している場合、カンマ区切りで番地を表示します。

5.繰り返し処理の中でセルが選択されていることを判定する

本題です。

「Sheet1」シートのB1からB10までのセルを順次サーチし、セルが選択されていることを判定する場合はIntersectメソッドを利用します。

Sub sample()
    Dim i As Integer
    for i = 1 To 10
        If Not Application.Intersect(ThisWorkbook.Worksheets("Sheet1").Cells(i, 2), Selection) Is Nothing Then
            MsgBox "セルが選択されています:" & Application.Intersect(ThisWorkbook.Worksheets("Sheet1").Cells(i, 2), ActiveCell).Address(False, False)
        End If
    Next i
End Sub

Intersectメソッドのパラメータには

  • 第1パラメータ:範囲1
  • 第2パラメータ:範囲2

を指定し、それぞれの範囲でセルを共有している場合にセルの情報を返却します。

セルを共有している場合には「Nothing」を返却します。

If文を「Not ~ Is Nothing」としているのは、「共有しているセルがNothingでなければ~」という判定を行っているためです。

ここでは選択したすべてのセルを対象にしたいので、4項の「Selection」を利用しています。

アクティブなセルだけを対象にしたい場合は、「Selection」を1項または2項で紹介した「ActiveCell」を利用します。

If Not Application.Intersect(ThisWorkbook.Worksheets("Sheet1").Cells(i, 2), ActiveCell) Is Nothing Then

6.ある範囲に選択されたセルが含まれていることをまとめて判定する

ある範囲に選択されたセルが含まれていることをまとめて判定するには、5項の判定文でRangeを利用します。

Sub sample()
    If Not Application.Intersect(Selection, Range("B1:B10")) Is Nothing Then
        MsgBox "セルが選択されています:" & ActiveCell.Address(False, False)
    End If
End Sub

ただし、この方法では1つのセルの情報しか取得できないようです。

7.参考サイト

参考サイトは下記です。ありがとうございました。

ActiveCell および Selection プロパティ
Comments [0] | Trackbacks [0]
2014年5月13日

VBAでFTP転送する方法

May 13,2014 1:55 AM
Tag:[, ]
Permalink

VBAでFTP転送する方法を紹介します。

1.はじめに

仕事で、VBAで出力したファイルをFTPで転送する必要が生じました。

これまではExcel VBAを使って一旦出力したファイルを別のスクリプトなどでFTP転送していましたが、そのまま転送できないか調べたところ、VBAを使ってFTP転送する方法がありました。

ということで、VBAでFTP転送する方法を紹介します。

2.BASP21.dllのダウンロード・インストール

VBAでFTP転送するにはBASP21.dllが必要です。

BASP21は、VBScriptやVisual Basic、VBAなどから使える汎用のコンポーネントで、FTP以外にも豊富な機能を有しています。

BASP21 DLL
BASP21 DLL

BASP21のページにアクセスして、ページにある「Down Load! BASP21-2003-0211.exe (1.44MB) 」のリンクをクリック。

ダウンロード

ダウンロードしたexeファイルを実行します。

使用許諾契約が表示されるので「はい」をクリック。

使用許諾契約

インストールが開始します。

インストール

インストールが開始したら「完了」をクリック。

インストール完了

3.VBAを使ったFTP

VBAでFTPを行うには、以下のコードを実装します。

Sub test()
    Dim ftp
    Dim rc As Long
    Dim host As String
    Dim user As String
    Dim pass As String
    Dim file As String
    Dim dest As String
 
    Set ftp = CreateObject("basp21.FTP")
    host = "ホストアドレス"
    user = "ユーザー名"
    pass = "パスワード"
    dest = "送信先ディレクトリ"
 
    rc = ftp.Connect(host, user, pass)
    If rc <> 0 Then
        MsgBox "接続NG"
        ftp.Close
        Exit Sub
    End If
 
    ftp.Command ("pasv")
 
    file = Application.GetOpenFilename() '送信ファイル
    rc = ftp.PutFile(file, dest)
    If rc <> 1 Then
        MsgBox "転送NG"
        ftp.Close
        Exit Sub
    End If
 
    MsgBox "転送OK"
    ftp.Close
End Sub

以下、コードの簡単な説明です。

まず、CreateObjectメソッドで"basp21.FTP"というオブジェクトを作成します。

    Set ftp = CreateObject("basp21.FTP")

FTP接続情報(ホストアドレス・ユーザー名・パスワード・送信ファイル・送信先ディレクトリ)を設定します。Application.GetOpenFilename()でファイル選択ダイアログが開きます。

    host = "ホストアドレス"
    user = "ユーザー名"
    pass = "パスワード"
    dest = "送信先ディレクトリ"

送信先ディレクトリを空にしておけばカレントディレクトリに送信されます。パスを指定する場合はカレントディレクトリからの相対パス指定のようです。

    dest = "test/" 'OK

次のようにルートからの絶対パスを設定するとNGになるので気をつけてください。

    dest = "/home/hoge/test/" 'NG

ConnectでFTPサーバに接続します。rcに0が返却されればOKです。

    rc = ftp.Connect(host, user, pass)

必要に応じてPASVモードにします。

    ftp.Command ("pasv")

PutFileでFTPサーバにファイルを転送します。rcには送信したファイル数が返却されます。1ファイル送信した場合、1が返却されればOKです。

    file = Application.GetOpenFilename() '送信ファイル
    rc = ftp.PutFile(file, Folder)

CloseでFTP接続を切断します。

    ftp.Close

Windowsのファイアウォールの設定によっては、下記のようなメッセージが表示されるので、「ブロックを解除する」をクリックしてください。

インストール完了

4.MKDについて

BASP21では、以下のコマンドでリモート側のディレクトリを作成することができます。

    ftp.Command ("MKD " & ディレクトリのフルパス)

ただし同時に作成できるディレクトリは1階層のみのようです。

たとえば、/home/hogeという既存のディレクトリがある場合、

    ftp.Command ("MKD /home/hoge/foo/bar/")

とするとNGになるようなので、

    ftp.Command ("MKD /home/hoge/foo/")
    ftp.Command ("MKD /home/hoge/foo/bar/")

という風に1階層ずつ作成してみてください。

コマンドの詳細や上記以外のコマンドについては下記のページで詳しく解説されています。

BASP21 FTPオブジェクト

2014.05.21
4項を追加しました。

Comments [0] | Trackbacks [0]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3