【VBA】入力された大文字を小文字に変換する_LCase
所定のフォルダに格納された任意のファイル形式のファイル数を数える処理を作りたく調べていたら見つけたVBA関数:LCase。備忘のために記載します。
使い方
LCase(変数)
これで、()内に入れた変数について、大文字⇒小文字に変換できる。
これを使い、A10セルに入力された値文字列について、大文字があれば小文字にしてA11セルにコピーするマクロを書いてみた↓
Sub TestLCase2()
Dim cell As Range
Dim ws As Worksheet
Set ws = ActiveSheet
Set cell = ws.Cells(10, 1)
ws.Cells(11, 1).Value = LCase(cell)
MsgBox "処理終了"
End Sub
実行前
実行後
【VBA】マクロが置かれているディレクトリにある全xlsxファイルの全シートを取得する
前回は任意のシート名のシートのみ取得してきたが、今回は全シート無条件取ってきたい。
完成コードは以下。
Sub SheetCopyVer6()
Dim macroWb As Workbook
Dim importWb As Workbook
Dim importPath As String
Dim SheetName As String
Dim buf As String
Dim objSheet As Worksheet
Set macroWb = ThisWorkbook
'SheetName = Range("A2").Value
importPath = ThisWorkbook.Path
buf = Dir(importPath & "\" & "*.xlsx")
Do
If buf = "" Then Exit Do
MsgBox buf
Set importWb = Workbooks.Open(importPath & "\" & buf)
For Each objSheet In importWb.Worksheets
SheetName = objSheet.Name
importWb.Worksheets(SheetName).Copy After:=macroWb.Worksheets("Sheet0")
Next
importWb.Close
buf = Dir()
Loop
End Sub
これは比較的つまずかず、構文エラーのみで求める挙動になった。
ポイントは、インポートファイルをセットしたあと、For Each‥‥シート名の数だけ処理を回させるところと、シート名の取得方法。
どちらもググればすぐ出てきて簡単だった。
備忘録
【VBA】マクロファイルが置かれているディレクトリにある全xlsxファイルから、任意のシートをコピーしたい
■作る機能
このマクロファイルが置かれているディレクトリに置かれているファイル(この膜rファイル自身は含まない)から、指定のシート名のシートをコピーしてくる。
■作るための方法
ループの方法
特定のフォルダにあるファイル数分処理をしたいので、ループ処理が必要。VBAのループはわからないので調べてみたところ、以下4つくらい方法がありそう。
使い分けとしては、すごく端折ると、簡単なループはシンプルにForで良いらしい(それかDo Loop)。今回のように、フォルダ内のファイル分だけ処理を繰り返すものは、Do While。ただそれも、Do Loopでも実装は可能ということ。
ちなみに最初、Do Whileでやってみたが、ファイル名がnullのファイルを開こうとしてしまうエラー(後述)にぶち当たったので、Do Loopに変更。Do Whileはまだ早かったようだ・・ほかにもやりたいことがあるので、一旦Do Loopで実装が出来れば今回はよしとした。
- Do While
- Do Until
- Do Loop
- For
■完成コード
Sub SheetCopyVer4()
Dim macroWb As Workbook
Dim importWb As Workbook
Dim importPath As String
Dim SheetName As String
Dim buf As String
Set macroWb = ThisWorkbook
SheetName = Range("A2").Value
importPath = ThisWorkbook.Path
buf = Dir(importPath & "\*")
Do
If ThisWorkbook.Name <> buf Then
End If
buf = Dir()
If buf = "" Then Exit Do
MsgBox buf
Set importWb = Workbooks.Open(importPath & "\" & buf)
importWb.Worksheets(SheetName).Copy After:=macroWb.Worksheets("Sheet0")
importWb.Close
Loop
End Sub
■つまずいた箇所
ファイル名 = ””の時は処理を抜けるように書いたつもりなのに抜けられておらず、ファイル名が””のファイルを開こうとして落ちてしまう。
■原因
Exitの位置。
正:
Do
If buf = "" Then Exit Do
MsgBox buf
Set importWb = Workbooks.Open(importPath & "\" & buf)
importWb.Worksheets(SheetName).Copy After:=macroWb.Worksheets("Sheet0")
importWb.Closebuf = Dir()
Loop
End Sub
誤:これだと、ファイル名(bufが空白の場合も、Workbooks.Open処理を走らせてしまいエラーになる)
Do
MsgBox buf
Set importWb = Workbooks.Open(importPath & "\" & buf)
importWb.Worksheets(SheetName).Copy After:=macroWb.Worksheets("Sheet0")
importWb.Close
buf = Dir()If buf = "" Then Exit Do
Loop
End Sub
品質保証は未実施・・バグはあるかもだが、力尽きたので今日はここまで。
【VBA】別ファイルのシートコピー
別のExcel ファイルにあるシートをコピーしてくるマクロ。
コピー時に取得するファイルのパス・シート名はハードコーディングなので改良の必要はあるがとりあえず動くもの↓
Sub SheetCopy()
'変数としては以下の通り①マクロがあるExcelファイル、②コピーしたいシートがあるExcel ファイル、③②のファイルが格納されているパスの3つ
Dim macroWb as WokSheet
Dim importWb as WorkSheet
Dim importPath as String
'コピー先のシート=macroWbと設定
Set macroWb = ThisWorkbook
Set importPaht = "[コピー対象のExcelを格納しているパス]"
'コピー対象のファイルを開く
Set importWb = Workbooks.Open(importPath)
importWb.WorkSheets("[コピー対象のシート名]").Copy After:=macroWb.WorkSheets("[どのシートの後にコピーするか"])
importWb.Close
Sub End
次回以降やってみたいこと:
- Excelファイル以外のファイルからの取得
- importするファイル名・シート名は変数化
- 1シートだけでなく全シートコピー
とりあえず動くものを作る【VBA】
直近、Excleマクロで業務をする必要があり、本・ネットで集めた情報をもとに勉強することにしました。
コーディングって、変数とか型とか…お作法学ぶだけでおなかいっぱいで、いざ動くものを作ろう‥って時には力尽きていることありますよね。
特に初心者だと直感的に入ってきにくい内容なのでつまずいて挫折してしまうことも多いかなと思います。(自分もそうです)
なので、とりあえず動くものを作る形で、形から入っていく形で、知識を深めていきたいと思います。
日々知り得たことは、備忘として各ブログに残していきます。