Option Explicit
‘エクスポートSQL
Private Sub Command_Click()
Dim Dbs As DAO.Database
Dim Qdf As DAO.QueryDef
Dim FileName As String
Dim FNum As Integer
Dim stSQL As String
Dim ret As Double
' データベースセット
Set Dbs = CurrentDb
'Set Dbs = DAO.OpenDatabase("c:\test.mdb") ' DBの指定がある場合
' ファイルを開く
FNum = FreeFile
FileName = Mid(Dbs.Name, InStrRev(Dbs.Name, "\") + 1)
FileName = Left(FileName, InStrRev(FileName, ".") - 1)
FileName = "c:\" & FileName & "_Query.txt"
Open FileName For Output Access Write As #FNum
'クエリ分ループ
For Each Qdf In Dbs.QueryDefs
'クエリ名&SQLステートメント取得
stSQL = "QueryName:" & Qdf.Name & vbCrLf & _
"SQL:" & Qdf.Sql & vbCrLf & vbCrLf
'ファイルに出力
Print #FNum, stSQL
Next
Set Dbs = Nothing
Close #FNum
'ファイルを開く(notepad.exe)
ret = Shell("notepad.exe " & FileName, vbNormalFocus)
End Sub
‘エクスポートSQL
Sub exportQueryAsSqlFile()
Dim db, query, nFP As Integer
MkDir (CurrentProject.Path & "\sql")
Set db = Application.CurrentDb
For Each query In db.QueryDefs
Debug.Print query.Name
nFP = FreeFile
Open CurrentProject.Path & "\sql\" & query.Name & ".sql" For Output As nFP
Print #nFP, query.Sql
Close nFP
Next query
End Sub
Sub フォルダ内のファイル名一覧を取得Dir() Dim buf As String, cnt As Long Const Path As String = “C:\Sample\” buf = Dir(Path & “*.xlsx”) Do While buf <> “” cnt = cnt + 1 Cells(cnt, 1) = buf buf = Dir() Loop End Sub Sub フォルダ内のファイル名一覧を取得_FileSystemObjectオブジェクト変数()
Dim FSO As Object
Set FSO = CreateObject(“Scripting.FileSystemObject”)
With FSO.GetFolder(“C:\”)
MsgBox .Files.Count & “個のファイルがあります”, vbInformation
End With
Set FSO = Nothing
End Sub
Sub フォルダ内のファイル名一覧を取得_FileSystemObject_with()
With CreateObject(“Scripting.FileSystemObject”)
If .DriveExists(“E”) Then
MsgBox “Eドライブが存在します”, vbInformation
Else
MsgBox “Eドライブは存在しません”, vbExclamation
End If
End With
End Sub
Sub シート名一覧取得()
Dim objSheetName As Worksheet
Dim objSheetNameMT As Worksheet
Dim i As Integer
'シート一覧を出力するシートを指定します。
Set objSheetNameMT = Sheets("一覧")
'一覧シートの内容を削除します。
objSheetNameMT.Columns("A:B").Clear
i = 1
'Sheetsから1シートづつ取得します。
For Each objSheetName In Sheets
'一覧シートはスキップします。
If objSheetName.Name <> "一覧" Then
'シート名を取得します。そして一覧シートへ出力します。
objSheetNameMT.Cells(i, 1).Value = objSheetName.Name
'A1セルの値を取得します。そして一覧シートへ出力します。
objSheetNameMT.Cells(i, 2).Value = objSheetName.Range("A1")
'シートへのハイパーリンクを設定します。
ActiveSheet.Hyperlinks.Add Anchor:=objSheetNameMT.Cells(i, 1), Address:="", SubAddress:="'" & objSheetName.Name & "'!A1", TextToDisplay:=objSheetName.Name
i = i + 1
End If
Next
End Sub
Sub ブック内の名前の定義一覧を取得()
Dim i As Integer
Dim a As Variant
‘先頭にシート「名前の定義」を追加
Worksheets.Add(Before:=Worksheets(1)).Name = “名前の定義”
‘ヘッダー行を入力
ActiveSheet.Cells(1, 1).Value = “名前の定義”
ActiveSheet.Cells(1, 2).Value = “参照先セル範囲”
ActiveSheet.Cells(1, 3).Value = “親要素(ブック名、シート名)”
ActiveSheet.Cells(1, 4).Value = “設定シート名”
‘ブック内の名前の定義を取得して書き出し
i = 1
‘ブック内の名前の定義で、ループ
For Each a In ActiveWorkbook.Names
i = i + 1
ActiveSheet.Cells(i, 1) = a.Name ‘名前を取得
ActiveSheet.Cells(i, 2) = “‘” & a.RefersTo ‘参照先を取得
ActiveSheet.Cells(i, 3) = a.Parent.Name ‘親要素を取得
ActiveSheet.Cells(i, 4) = Range(a).Parent.Name ‘シート名
Next
End Sub
Sub ◆最下行を取得()
End Sub
Sub ◆値化()
End Sub
Sub ブック内の条件付き書式一覧を取得()
‘先頭にシート「条件付き書式」を追加
Worksheets.Add(Before:=Worksheets(1)).Name = “条件付き書式”
Dim fc As FormatCondition
For Each fc In Cells.FormatConditions
If fc.Type = xlExpression Then
Debug.Print _
fc.AppliesTo.Address(False, False) & vbTab & _
fc.Formula1
End If
Next fc
End Sub
Sub アクティブシートの条件付き書式一覧を取得()
Dim xRg As Range, xCell As Range
Dim xFormat As Object
Dim xFmStr, xFmAddress As String
Dim xDic As New Dictionary
Dim xSpArr, xOperatorArr
On Error Resume Next
Set xRg = ActiveSheet.Cells.SpecialCells(xlCellTypeAllFormatConditions)
If xRg Is Nothing Then Exit Sub
xDic.Item(“Title”) = “Type|Typename|Range|StopIfTrue|Operator|Formula1|Formula2|Formula3”
If xSpArr.Count = 0 Then
xSpArr = Split(“Cell Value|Expression|Color Scale|DataBar|Top 10|Icon Sets||Unique Values|Text|Blanks|Time Period|Above Average||No Blanks||Errors|No Errors|||||”, “|”)
xOperatorArr = Split(“xlBetween|xlNotBetween|xlEqual|xlNotEqual|xlGreater|xlLess|xlGreaterEqual|xlLessEqual”, “|”)
End If
For Each xCell In xRg
Set xFormat = xCell.FormatConditions(1)
xFmAddress = xFormat.AppliesTo.Address
If Not xDic.Exists(xFmAddress) Then
xDic.Item(xFmAddress) = xFormat.Type & “|” & xSpArr(xFormat.Type – 1) & “|” & xFmAddress & “|” & xFormat.StopIfTrue
If Not IsEmpty(xFormat.Operator) Then
xDic.Item(xFmAddress) = xDic.Item(xFmAddress) & “|” & xOperatorArr(xFormat.Operator – 1)
End If
If Not IsEmpty(xFormat.Formula1) Then
xDic.Item(xFmAddress) = xDic.Item(xFmAddress) & "|'" & xFormat.Formula1
End If
End If
Next
If ActiveWorkbook.Worksheets(“FmCondictionList”) Is Nothing Then
Sheets.Add.Name = “FmCondictionList”
End If
Sheets(“FmCondictionList”).Cells(1).Resize(xDic.Count) = Application.Transpose(xDic.items)
Sheets(“FmCondictionList”).Columns(1).TextToColumns , , , , 0, 0, 0, 0, -1, “|”
End Sub
Sub ブック内のリンク一覧を取得()
Dim sht As Worksheet '// ワークシート
Dim ar() As String '// ハイパーリンク配列
Dim hLink As Hyperlink '// ハイパーリンク
Dim sCellAddress As String '// セル座標
Dim sLinkAddress As String '// リンク先
Dim sType As String '// 種類
Dim s As Variant '// 配列の要素文字列
Dim v As Variant '// 分割
ReDim ar(0)
'// アクティブブックの全シートをループ
For Each sht In Worksheets
'// シート内のハイパーリンクをループ
For Each hLink In sht.Hyperlinks
'// Range(セル)の場合
If hLink.Type = msoHyperlinkRange Then
sCellAddress = hLink.Range.Address(False, False)
sType = "セル"
'// Shape(画像)の場合
ElseIf hLink.Type = msoHyperlinkShape Then
sCellAddress = hLink.Shape.TopLeftCell.Address(False, False)
sType = "画像"
End If
'// 外部リンクが設定されている場合
If hLink.Address <> "" Then
'// 外部へのハイパーリンクを取得
sLinkAddress = hLink.Address
'// 内部リンクが設定されている場合
Else
'// 内部へのハイパーリンクを取得
sLinkAddress = hLink.SubAddress
End If
'// シート名+セル座標+種類+アドレス
ar(UBound(ar)) = sht.Name & vbTab & sCellAddress & vbTab & sType & vbTab & sLinkAddress
ReDim Preserve ar(UBound(ar) + 1)
Next
Next
'// 配列に格納済みの場合
If IsEmpty(ar(0)) = False Then
'// 余分な領域を削除
ReDim Preserve ar(UBound(ar) - 1)
End If
‘先頭にシート「条件付き書式」を追加
Worksheets.Add(Before:=Worksheets(1)).Name = “リンク”
'ヘッダー行を入力
‘ ActiveSheet.Cells(1, 1).Value = “シート名”
‘ ActiveSheet.Cells(1, 2).Value = “座標”
‘ ActiveSheet.Cells(1, 3).Value = “種類”
‘ ActiveSheet.Cells(1, 4).Value = “アドレス”
'// ハイパーリンクの数ループ
For Each s In ar
'// TAB文字で分割
v = Split(s, vbTab)
'// A列にシート名を出力
ActiveCell.Value = v(0)
'// B列に座標を出力
ActiveCell.Offset(0, 1).Value = v(1)
'// C列に種類を出力
ActiveCell.Offset(0, 2).Value = v(2)
'// D列にアドレスを出力
ActiveCell.Offset(0, 3).Value = v(3)
'// 下のセルを選択
ActiveCell.Offset(1, 0).Select
Next
End Sub
Sub アクティブなブックの全コメントを一覧にする()
Const ROW_HEAD As Long = 1 ‘ コメント一覧の見出し行とする行番号
Dim cmnt As Comment
Dim cnt_sh As Long ‘ ワークシートの枚数
Dim num_row As Long ‘ コメントを一覧にして出力する行番号
Dim msg As String
‘ コメント一覧を作成するシートの挿入と見出しの作成
‘ Worksheets.Add(Before:=Worksheets(Worksheets.Count)).Name = “名前の定義”
Worksheets.Add(Before:=Worksheets(1)).Name = “コメント”
Cells(ROW_HEAD, 1).Value = “ワークシート名”
Cells(ROW_HEAD, 2).Value = “セル番地”
Cells(ROW_HEAD, 3).Value = “コメント”
‘ コメント一覧の作成
num_row = ROW_HEAD
For cnt_sh = 2 To Worksheets.Count
For Each cmnt In Worksheets(cnt_sh).Comments
num_row = num_row + 1
Cells(num_row, 1).Value = Worksheets(cnt_sh).Name
Cells(num_row, 2).Value = cmnt.Parent.Address(False, False)
Cells(num_row, 3).Value = cmnt.Text
Next cmnt
Next cnt_sh
msg = “”
If num_row = ROW_HEAD Then
‘ コメントが存在しないときに挿入したコメント一覧用シートを削除
Application.DisplayAlerts = False
Worksheets(1).Delete
Application.DisplayAlerts = True
msg = “アクティブなブックにコメントは存在しません。”
Else
msg = “『” & Worksheets(1).Name & “』にコメント一覧を作成しました。”
End If
MsgBox msg
End Sub
Sub シェイプ数をカウント()
MsgBox ActiveSheet.Shapes.Count
End Sub
Sub Sample1()
‘図形を指定
Dim Shp As Shape
For Each Shp In ActiveSheet.Shapes
With Shp
'名前を取得する
Debug.Print "Name: " & .Name & ", type: " & .Type & " , Top: " & .Top & ", AlternativeText: " & .AlternativeText
‘ Debug.Print Top
‘ MsgBox “Name” & .Name & “type” & .Type & .MsoShapeType & .ShapeRange.Type
End With
Next Shp
End Sub
Sub 入力規則のTypeを調べるFor_Each() Dim rng As Range On Error GoTo ERR_HNDL For Each rng In Cells.SpecialCells(xlCellTypeAllValidation) Debug.Print
rng.Address(False, False) & vbTab & _
rng.Validation.Type
Next rng
Exit Sub
ERR_HNDL:
Err.Clear
MsgBox “入力規則が設定されていません。”
End Sub
Sub ◆ブック内のシートの保護一覧を取得()
End Sub
Sub ◆ブック内のmodue()
End Sub
Sub csv読込1()
Application.ScreenUpdating = False
Dim OpenFileName As Variant
OpenFileName = Application.GetOpenFilename _
("CSVファイル,*.csv*", MultiSelect:=True)
If Not IsArray(OpenFileName) Then
MsgBox "キャンセルしました。": Exit Sub
End If
Dim FSO As FileSystemObject
Set FSO = New FileSystemObject
Dim n As Long '選択したファイル数、処理を繰り返す
For n = LBound(OpenFileName) To UBound(OpenFileName)
Dim WB As Workbook
Set WB = Workbooks.Open(OpenFileName(n))
Dim strBaseName As String
strBaseName = FSO.GetBaseName(WB.Name) '拡張子を除くファイル名を取得
'同じファイル名で同じ階層にExcel形式で保存する
WB.SaveAs _
FileName:=WB.Path & "\" & strBaseName, FileFormat:=xlWorkbookDefault
WB.Close SaveChanges:=False
Set WB = Nothing 'いったん解放
Next n
Application.ScreenUpdating = True
MsgBox "終了しました。"
End Sub
Sub CSV読込2()
Dim myFileName As Variant
Dim Fcn As Long
Dim i As Long
Dim buf As String
Dim tmp As Variant
myFileName = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", _
Title:="CSVファイルの選択")
If myFileName = False Then
Exit Sub
End If
With Worksheets("Sheet1")
Open myFileName For Input As #1
Do Until EOF(1)
Line Input #1, buf
Fcn = Fcn + 1
tmp = Split(buf, ",")
'書き出し
.Cells(Fcn + 1, 1).NumberFormatLocal = "@"
.Cells(Fcn + 1, 1).Value = CStr(tmp(0))
.Cells(Fcn + 1, 2).NumberFormatLocal = "yyyy年m月d日"
.Cells(Fcn + 1, 2).Value = DateValue(tmp(1))
For i = 2 To UBound(tmp)
.Cells(Fcn + 1, i + 1).Value = tmp(i)
Next i
Loop
Close #1
End With
End Sub
Sub CSV読込3()
Dim myFileName As Variant
Dim Fcn As Long
Dim i As Long, j As Long
Dim buf As String
Dim tmp As Variant
Dim tmp2() As Variant
Dim cnt As Integer
Dim myflag As Boolean
myFileName = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", _
Title:="CSVファイルの選択")
If myFileName = False Then
Exit Sub
End If
With Worksheets("Sheet1")
Open myFileName For Input As #1
Do Until EOF(1)
Line Input #1, buf
Fcn = Fcn + 1
tmp = Split(buf, ",")
myflag = False
cnt = 0
For i = LBound(tmp) To UBound(tmp)
If myflag = False And Left(tmp(i), 1) = """" And Right(tmp(i), 1) = """" Then
cnt = cnt + 1
ReDim Preserve tmp2(cnt)
tmp2(cnt) = Mid(tmp(i), 2, Len(tmp(i)) - 2)
ElseIf myflag = False And Left(tmp(i), 1) <> """" And Right(tmp(i), 1) <> """" Then
cnt = cnt + 1
ReDim Preserve tmp2(cnt)
tmp2(cnt) = tmp(i)
ElseIf Left(tmp(i), 1) = """" And Right(tmp(i), 1) <> """" Then
cnt = cnt + 1
ReDim Preserve tmp2(cnt)
tmp2(cnt) = Mid(tmp(i), 2, Len(tmp(i)))
myflag = True
ElseIf myflag = True And Left(tmp(i), 1) <> """" And Right(tmp(i), 1) <> """" Then
tmp2(cnt) = tmp2(cnt) & tmp(i)
ElseIf myflag = True And Left(tmp(i), 1) <> """" And Right(tmp(i), 1) = """" Then
tmp2(cnt) = tmp2(cnt) & Left(tmp(i), Len(tmp(i)) - 1)
myflag = False
End If
Next i
'書き出し
For i = 1 To UBound(tmp2)
.Cells(Fcn + 1, i).Value = tmp2(i)
Next i
Loop
Close #1
End With
End Sub
Sub 複数ブック1ブック化()
Application.ScreenUpdating = False ‘画面更新を一時停止
Set mb = ThisWorkbook 'このコピー先ブックをmbとする。
myfdr = ThisWorkbook.Path
fname = Dir(myfdr & "\*.xls") 'フォルダ内のExcelブックを検索
Do Until fname = Empty '全て検索
If fname <> mb.Name Then 'ブック名がこのブックの名前でなければ
Set WB = Workbooks.Open(myfdr & "\" & fname) 'そのブックを開きwbとする。
WB.ActiveSheet.Copy After:=mb.Sheets(mb.Sheets.Count) 'コピーしてコピー先ブックの末尾に置く
WB.Close (False) '保存の有無を聞かずに保存しないで閉じる
n = n + 1 'ブック数をカウント
End If
fname = Dir 'フォルダ内の次のExcelブックを検索
Loop '繰り返す
Application.ScreenUpdating = True '画面更新一時停止を解除
MsgBox n & "件のブックをコピーしましました。"
End Sub
Sub 複数シート1シート化()
Dim sWS As Worksheet ‘データシート(コピー元)
Dim dWS As Worksheet ‘集約用シート(コピー先)
Set dWS = Worksheets("AllData")
'集約用シートの2行目以降を削除
dWS.UsedRange.Offset(1, 0).Clear
'各シートの2行目以降のデータを、集約用シートの末尾にコピー
For Each sWS In Worksheets
If sWS.Name <> dWS.Name Then
With sWS.UsedRange
'コピー元シートにデータが1件以上ある場合
If .Rows.Count > 1 Then
.Offset(1, 0).Resize(.Rows.Count - 1).Copy _
Destination:=dWS.Cells(Rows.Count, 1). _
End(xlUp).Offset(1, 0)
End If
End With
End If
Next sWS
'集計用シートをA列で並べ替え
dWS.UsedRange.Sort Key1:=Range("A1"), Header:=xlYes
End Sub
Sub SearchFomula()
‘アクティブシートの数式が入力されたセルをイミディエイトウィンドウへ出力する
Dim r As Range ‘// 1セル
Dim f ‘// Formulaプロパティ値
Dim v ‘// Valueプロパティ値
Dim adrs ‘// セル位置
Dim msg ‘// 出力メッセージ
'// 入力セル範囲をループ
For Each r In ActiveSheet.UsedRange
'// FormulaプロパティとValueプロパティを取得
f = r.Formula
v = r.Value
'// 一番左が「=」で、かつ、FormulaプロパティとValueプロパティが異なる場合
If Left(f, 1) = "=" And f <> v Then
adrs = r.Address(False, False)
msg = msg & adrs & vbCr
End If
Next
Debug.Print msg
‘ ‘// メッセージボックスに出力
‘ Call MsgBox(msg)
End Sub
Sub ListLinks()
‘外部参照を一覧表示する
Dim xSheet As Worksheet
Dim xRg As Range
Dim xCell As Range
Dim xCount As Long
Dim xLinkArr() As String
On Error Resume Next
For Each xSheet In Worksheets
Set xRg = xSheet.UsedRange.SpecialCells(xlCellTypeFormulas)
If xRg Is Nothing Then GoTo LblNext
For Each xCell In xRg
If InStr(1, xCell.Formula, "[") > 0 Then
xCount = xCount + 1
ReDim Preserve xLinkArr(1 To 2, 1 To xCount)
xLinkArr(1, xCount) = xCell.Address(, , , True)
xLinkArr(2, xCount) = "'" & xCell.Formula
End If
Next
LblNext:
Next
If xCount > 0 Then
Sheets.Add(Sheets(1)).Name = “Link Sheet”
Range(“A1”).Resize(, 2).Value = Array(“Location”, “Reference”)
Range(“A2”).Resize(UBound(xLinkArr, 2), UBound(xLinkArr, 1)).Value = Application.Transpose(xLinkArr)
Columns(“A:B”).AutoFit
Else
MsgBox “No links were found within the active workbook.”, vbInformation, “KuTools for Excel”
End If
End Sub


コメント