SSブログ

エクセル小僧:別のエクセルファイルから文字列をコピーするマクロ【コード編】

別のエクセルファイル(以下、ワークブックと呼ぶ)から、文字列を
コピーしてくるマクロのコピーボタンのマクロのコードを示します。ワークシート側の設定については、

http://blog.so-net.ne.jp/cheese999/2012-12-23

を参照して下さい。

【コード:コピーボタン】

コピーボタンから呼ばれるマクロは、『USCopyIP2』です。

01:Function UFDelSP1(Str1 As String, Mode1 As Integer) As String
02:  ' 【機能】文字列からスペースを削除
03:  ' 【引数】
04:  ' Str1 : 文字列(例:" 10. 2. 1. 2")
05:  ' Mode1 : モード
06:  ' 2^0=1 : 半角スペースを削除
07:  ' 2^1=1 : 全角スペースを削除
08:  ' 【変数】
09:  Dim DelChr1 As Variant ' 削除する文字
10:  Dim Str2 As String ' 文字列
11:  Dim myMode2(1) As Integer ' モード
12:  Dim i As Integer ' 整数
13:  ' 【コード】
14:  DelChr1 = Array(" ", " ") ' 削除する文字
15:  Str2 = Str1
16:  For i = 0 To 1
17:    If Int(Mode1 / (2 ^ i)) Mod 2 = 1 Then
18:      Str2 = Replace(Str2, DelChr1(i), "") ' DelChr1(i)を削除
19:    End If
20:  Next i
21:  UFDelSP1 = Str2
22:End Function

01:Function UFShtChk1(mySheet As Variant, Wb1 As Workbook) As Boolean
02:  ' 【機能】シートが存在するか確認
03:  ' 【引数】
04:  ' mySheet : シート名
05:  ' Wb1 : コピー元のエクセルファイル
06:  ' 【変数】
07:  Dim i As Integer ' 整数
08:  ' 【コード】
09:  UFShtChk1 = False
10:  ' シート枚数分、繰り返す
11:  For i = 1 To Wb1.Worksheets.Count
12:    If Wb1.Worksheets(i).Name = mySheet Then
13:      UFShtChk1 = True ' 見つかった!
14:      Exit For
15:    End If
16:  Next
17:End Function

01:Function UFNameChk1(myName1 As Variant, Wb1 As Workbook) As Boolean
02:  ' 【機能】ワークブックにその名前が存在するか確認
03:  ' 【引数】
04:  ' myName1 : 名前
05:  ' Wb1 : ワークブック(エクセルファイル)
06:  ' 【変数】
07:  Dim oName As Name ' 名前(繰り返し用)
08:  ' 【コード】
09:  UFNameChk1 = False ' 名前は見つかっていない
10:  For Each oName In Wb1.Names
11:    If oName.Name = myName1 Then
12:      UFNameChk1 = True ' 名前が見つかった!
13:      Exit For
14:    End If
15:  Next oName
16:End Function

01:Function UFWbOpnChk1(FilePath1 As String) As Boolean
02:  ' 【機能】ファイルが既に開かれているか確認
03:  ' 【引数】
04:  ' FilePath1 : ファイルのフルパス
05:  ' 【変数】
06:  Dim Wb As Workbook ' ワークブック
07:  Dim FilePath2 As String ' 既に開いているファイルのフルパス
08:  ' 【コード】
09:  UFWbOpnChk1 = False
10:  For Each Wb In Workbooks
11:    FilePath2 = Wb.Path & "\" & Wb.Name
12:    If FilePath1 = FilePath2 Then
13:      UFWbOpnChk1 = True ' 既に開かれている
14:      Exit For
15:    End If
16:  Next Wb
17:End Function

01:Sub USCopyIP2()
02:  ' 【機能】IPアドレスをコピー
03:  ' 【変数】
04:  Dim myRange1 As Variant ' セル範囲(Range)
05:  ' myRange1(0) : コピー元のエクセルファイル名のRange
06:  ' myRange1(1) : コピー元のエクセルファイルのシート名のRange
07:  ' myRange1(2) : コピー元のセル名のRange
08:  ' myRange1(3) : ファイルパスの形式のRange
09:  ' myRange1(4) : コピー先のシート名のRange
10:  ' 【コード】
11:  myRange1 = Array("file1", "sheet1", "cell1", "TypeFilePath", "sheet2")
12:  ' MsgBox UBound(myRange1)
13:  Call USCopyData1(myRange1, True)
14:End Sub

001:Sub USCopyData1(myRange1 As Variant, Mode1 As Boolean)
002:  ' 【機能】ファイル間でデータをコピー
003:  ' 【引数】
004:  ' myRange1(0) : コピー元のエクセルファイル名のRange
005:  ' myRange1(1) : コピー元のエクセルファイルのシート名のRange
006:  ' myRange1(2) : コピー元のセル名のRange
007:  ' myRange1(3) : ファイルパスの形式のRange
008:  ' myRange1(4) : コピー先のシート名のRange
009:  ' mode1 : 文字列からスペースを削除するか(True:する)
010:  ' 【変数】
011:  Dim Wb1(1) As Workbook ' エクセルファイル
012:  ' Wb1(0) : コピー元(Wb1)
013:  ' Wb1(1) : コピー先(ThisWorkbook)
014:  Dim FilePath1 As String ' コピー元のエクセルファイルのパス
015:  Dim myFile1 As String ' コピー元のエクセルファイル名
016:  Dim mySheet1 As Variant ' エクセルファイルのシート名
017:  ' mySheet1(0) : コピー元(Sheet2)
018:  ' mySheet1(1) : コピー先(Sheet3)
019:  Dim myCell1 As Variant ' コピー元/コピー先のセル名
020:  Dim myStr1(1) As Variant ' コピーする文字列
021:  ' myStr1(0) : コピー元(myStr1)
022:  ' myStr1(1) : コピー先(myStr2)
023:  Dim TypeFilePath1 As String ' ファイルパスの形式
024:  Dim Ans1 As Integer ' 答え
025:  Dim i, j, k As Integer ' 整数
026:  ' 【コード】
027:  On Error GoTo myError
028:  If UFShtChk1(Range(myRange1(4)).Value, ThisWorkbook) = False Then
029:    Ans1 = MsgBox("シートが見つかりません。" & vbCrLf & _
030:    "ファイル名:" & ThisWorkbook.Name & vbCrLf & _
031:    "シート名:" & Range(myRange1(4)).Value, vbOKOnly + vbExclamation)
032:    ' マクロを抜ける
033:    Exit Sub
034:  End If
035:  With ThisWorkbook.Sheets(Range(myRange1(4)).Value)
036:    ' コピー元のエクセルファイル名
037:    myFile1 = .Range(myRange1(0)).Value
038:    ' エクセルファイルのシート名(コピー元, コピー先)
039:    mySheet1 = Array(.Range(myRange1(1)).Value, _
040:               .Range(myRange1(4)).Value)
041:    ' コピー元/コピー先のセル名
042:    myCell1 = Split(.Range(myRange1(2)).Value, ",")
043:    ' ファイルパスの形式
044:    TypeFilePath1 = .Range(myRange1(3)).Value
045:  End With
046:  ' コピー元のエクセルファイルのパスを持ってくる
047:  Select Case TypeFilePath1
048:  Case "ファイル名"
049:    FilePath1 = ThisWorkbook.Path & "\" & myFile1
050:  Case "フルパス"
051:    FilePath1 = myFile1
052:  Case Else
053:    Ans1 = MsgBox("ファイルパスの形式が範囲外です。", vbOKOnly + vbExclamation)
054:    Exit Sub
055:  End Select
056:  ' コピー元ファイルの存在を確認する
057:  If Dir(FilePath1) = "" Then
058:    Ans1 = MsgBox("コピー元ファイルが見つかりません。" & vbCrLf & _
059:    "ファイル名:" & FilePath1, vbOKOnly + vbExclamation)
060:    Exit Sub
061:  End If
062:  ' コピー元ファイルが既に開いているか確認する
063:  If UFWbOpnChk1(FilePath1) = True Then
064:    Ans1 = MsgBox("コピー元ファイルが既に開いています。" & vbCrLf & _
065:    "ファイル名:" & FilePath1, vbOKOnly + vbExclamation)
066:    Exit Sub
067:  End If
068:  ' スクリーン更新停止
069:  Application.ScreenUpdating = False
070:  ' コピー元ファイルを開く
071:  Set Wb1(0) = Workbooks.Open(Filename:=FilePath1, ReadOnly:=True)
072:  ' コピー先ファイル
073:  Set Wb1(1) = ThisWorkbook
074:  ' シートの存在を確認
075:  For i = 0 To 1
076:    If UFShtChk1(mySheet1(i), Wb1(i)) = False Then
077:      Ans1 = MsgBox("シートが見つかりません。" & vbCrLf & _
078:      "ファイル名:" & Wb1(i).Name & vbCrLf & _
079:      "シート名:" & mySheet1(i), vbOKOnly + vbExclamation)
080:     ' コピー元のエクセルファイルを閉じる。保存はしない。
081:      Wb1(0).Close (False)
082:      ' スクリーン更新再開
083:      Application.ScreenUpdating = True
084:      ' マクロを抜ける
085:      Exit Sub
086:    End If
087:  Next i
088:  ' セル名の数だけ、繰り返す
089:  For i = 0 To UBound(myCell1)
090:    ' j=0(コピー元) j=1(コピー先)
091:    For j = 0 To 1
092:      ' セル名を確認する
093:      If UFNameChk1(myCell1(i), Wb1(j)) = False Then
094:        Ans1 = MsgBox("名前が見つかりません。" & vbCrLf & _
095:        "ファイル名:" & Wb1(j).Name & vbCrLf & _
096:       "名前:" & myCell1(i), vbOKOnly + vbExclamation)
097:        ' コピー元のエクセルファイルを閉じる。保存はしない。
098:        Wb1(0).Close (False)
099:        ' スクリーン更新再開
100:        Application.ScreenUpdating = True
101:        ' マクロを抜ける
102:        Exit Sub
103:      End If
104:    Next j
105:  Next i
106:  ' セル名の数だけ、繰り返す
107:  For i = 0 To UBound(myCell1)
108:    ' j=0(コピー元) j=1(コピー先)
109:    For j = 0 To 1
110:      ' セル範囲(Range)をファイルごとにmyStr1変数にセットする
111:      Set myStr1(j) = Wb1(j).Sheets(mySheet1(j)).Range(myCell1(i))
112:    Next j
113:    ' 1セルごとにデータをコピー
114:    For j = 1 To myStr1(0).Rows.Count
115:      For k = 1 To myStr1(0).Columns.Count
116:        If Mode1 = True Then
117:          ' スペースを削除してコピー
118:          myStr1(1).Cells(j, k).Value = UFDelSP1(myStr1(0).Cells(j, k).Value, 3)
119:        Else
120:          ' そのままコピー
121:          myStr1(1).Cells(j, k).Value = myStr1(0).Cells(j, k).Value
122:        End If
123:      Next k
124:    Next j
125:  Next i
126:  ' コピー元のエクセルファイルを閉じる。保存はしない。
127:  Wb1(0).Close (False)
128:  ' スクリーン更新再開
129:  Application.ScreenUpdating = True
130:  ' 完了メッセージ
131:  Ans1 = MsgBox("コピーを完了しました。")
132:  Exit Sub
133:myError:
134:  ' エラー処理
135:  Ans1 = MsgBox("エラーですよ。", vbOKOnly + vbExclamation)
136:  ' コピー元のエクセルファイルを閉じる。保存はしない。
137:  Wb1(0).Close (False)
138:  ' スクリーン更新再開
139:  Application.ScreenUpdating = True
130:End Sub

【コード:ファイル名ボタン】
コードは次回、掲載します。
類似コードとしては、
http://blog.so-net.ne.jp/cheese999/2012-09-24
が、あたります。

ヤバイぜ!(6)  コメント(6)  トラックバック(0) 
共通テーマ:パソコン・インターネット

ヤバイぜ! 6

コメント 6

cheese999

nice! ありがとうございます。
(^_0)ノ
by cheese999 (2012-12-25 04:31) 

haku

Very Merry Heavy Metal Christmas~☆ (^0^)/
by haku (2012-12-25 09:57) 

alba0101

ご訪問&コメントありがとうございます^^

楽しい年の瀬をお過ごし下さい(^^)/
by alba0101 (2012-12-25 11:08) 

モッズパンツ

☆       ☆        ☆
   ☆       ☆        ☆      ☆
☆        ☆       ☆      ☆
             ☆       ☆        ☆
 ☆    ◯    ◯         ☆      ☆  /⊃/⊃
       ヽ ̄\ ヽ ̄\  ☆       ☆      ( ⊃| ⊃
 /´ ̄`ヽ /   ヽ /   ヽ              ☆   \⊃ヽ⊃
/      (二二二)(二二二)                ミ| |_| |
|       川 ゚∀゚)( ´∀`)            / ̄─彡⊂ ・ \
人 x| ̄ ̄ ̄|⌒)⊃C)))⊃C)∞∞∞∞∞∞∞∞/      彡   ソ゚
   |      ̄|_,) ) ⌒) ⌒) |        |  _  _彳〃〃〃ミ
   |______|三三三三三三|_      | / >>   \ヽノ
☆  | |__| |_ノ ノ__| |_ノ ノ      ||  //   /||
                             // ||   //||
by モッズパンツ (2012-12-25 23:21) 

cheese999

みなさ~ん、
めり~・くり~すま~す!
(^_0)ノ
by cheese999 (2012-12-25 23:22) 

cheese999

誤記を訂正しました。
(^_0)ノ
by cheese999 (2012-12-28 22:57) 

Facebook コメント

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。