6-3 Excel97・Excel2000・Excel2003 HPから残し
6-3(1) オブジェクト名とセル位置取得
○●●下記マクロはオブジェクトがどのセルにあるか取得し、別シ−トへオブジェクト
のみ貼り付ける場合等に使用できる。
Dim obg(2, 50) As String 'オブジェクト名
'
Sub 例299()
'オブジェクトチェック
i = 0
For Each ex In ActiveSheet.Shapes
obg(0, i) = ex.Name
obg(1, i) = ex.TopLeftCell.Row
obg(2, i) = ex.TopLeftCell.Column
Msg = "オブジェクト名 " & obg(0, i) & _
": Cells(" & obg(1, i) & "," & obg(2, i) & ")"
celad = MsgBox(Msg, 1, "セル位置")
If celad = 2 Then
Exit Sub
End If
i = i + 1
Next
End Sub
・下側のセルは"BottomRightCell"で取得
6-3(2) 拡張子の取得
○○●拡張子の取得はExcel2000で追加されたInStrRev関数で容易に取得出来る。
Sub 例2917)
fff = Application.GetOpenFilename(Title:="ファイル指定")
i = InStrRev(fff, ".")
ext = Mid(fff, i)
MsgBox ext
End Sub
●●●下記はInStrRev関数を使用しないケ−ス(Excel95/97)
Sub 例2917a()
fff = Application.GetOpenFilename(Title:="ファイル指定")
i = 0: ia = 1
Do
i = InStr(ia, fff, ".")
ia = InStr(i + 1, fff, ".")
If ia = 0 Then
ext = Mid(fff, i)
End If
Loop Until ia = 0
MsgBox ext
End Sub
本例は最後に出てきた"."以降を拡張子としています。
6-3(3) 相対アドレスの取得
●●●Excelでは相対アドレスを使用しないが、HTMLファイルをマクロで各種
処理する場合は必要となる。下記例は「検索エンジンもどき:KIengine」を作成
した時考えたので紹介します。

■ このマクロは始めに指定したフォルダ−を基点として、2回目以降に指定した
フォルダ−の相対アドレスを取得(なお指定はファイルを1個指定して下さい)。
Dim fff1 As String
Dim fff2 As String
Dim kai As Integer
Dim f(1, 50)
Sub eeee1()
kai = 0
eeee2
kai = 1
eeee2
End Sub
Sub eeee2()
'ダイアログ表示
If kai = 0 Then
fsitei = "基準ファルダ−指定"
Else
fsitei = "相対アドレスをチェックするファルダ−指定"
End If
fff = Application.GetOpenFilename(Title:=fsitei)
If fff = "False" Then
MsgBox "ファイルを1個指定して下さい"
End
End If
dai = fff
If kai = 0 Then
fff1 = fff
k = 0
Else
fff2 = fff
k = 1
End If
For i = 1 To 20: f(k, i) = "": Next
i = 1: ssa1 = 0: fname = ""
Do
ssa = InStr(1, dai, "\", 1)
ssa1 = ssa1 + ssa
If ssa > 0 Then
dai = Mid(dai, ssa + 1)
ssb = InStr(1, dai, "\", 1)
If ssb > 0 Then
f(k, i) = Left(dai, ssb - 1)
End If
i = i + 1
End If
Loop Until ssa = 0
If kai = 0 Then
Exit Sub
End If
'相対パス設定
sad = ""
For i = 1 To 50
If f(0, i) <> f(1, i) Then
If f(0, i) = "" Then
sad = sad & f(1, i) & "/"
Else
If f(1, i) = "" Then
sad = sad & "../"
Else
sad = sad & "../"
For j = 49 To i Step -1
f(1, j + 1) = f(1, j)
Next
End If
End If
Else
If f(0, i) = "" Then
Exit For
End If
End If
Next
'メッセ−ジ
fname = Mid(fff2, ssa1)
msg = "基点となるファルダ−" & fff1 & Chr$(10) & _
"確認したいファルダ−" & fff2 & Chr$(10) & _
"相対アドレスは " & sad & fname & Chr$(10) & Chr$(10) & _
"(他のフォルダ−も確認しますか)"
kesu = MsgBox(msg, 4, "相対アドレス")
If kesu = 6 Then
eeee2
Else
End
End If
End Sub
6-3(4) ワ−クシ−ト上のデ−ダ数量取得
●●●
ワ−クシ−トにあるデ−タ数量を知る必要があり作成。

Sub Macro1()
Range("A4").CurrentRegion.Select
cel1 = Selection.Cells.Count
cel2 = Selection.SpecialCells(xlBlanks).Count
Range("A1").Select
MsgBox cel1 - cel2
End Sub
6-3(5) デ−タベ−スのHTML形式に変換(配列変数使用)
○●●
・Sheet1にあるデ−タベ−スをSheet2へWebで表示できるデ−タに変換します。
・実際にWebで表示する場合は、Sheet2を拡張子「.prn」で保存し、Excelを終了
してから、ディスクトップのマイコンピュ−タ-から対象の「***.prn」を
「***.html」に変えて下さい。
・上記の拡張子変換はマクロで簡単に行なうことできますが、下記マクロは
では省略してあります。
・なお、26-52項(CSVファイル高速読み取り)、この29-54項及び
自動HTML変換を、サンプルNo[19]にまとめましたので、必要な方は
ダウンロ−ドして使用して下さい。
※ 配列変数を使用してHTMLに変換したこの方式は、時間的には高速に
なりますが、文字フォントやセルの背景色等の変換は出来ません。
(Excelワ−クシ−トの内容をHTML変換はサンプルマクロ「KIweb」で
出来ます。
Dim i As Integer '数字カウント
Dim j As Integer '数字カウント
Dim cend As Integer '列
Dim rend As Integer '行
Dim hro As Integer 'html行
Dim dbas As String '1行分のデ−タ
Dim dt() As String
Dim tdat As Variant
Sub 例2954()
Application.ScreenUpdating = False
Sheets("Sheet2").Select
Columns("A:A").ColumnWidth = 255
'ヘッダ−部書込み
hro = 1: Cells(hro, 1) = "<HTML>"
hro = hro + 1: Cells(hro, 1) = "<HEAD>"
hro = hro + 1: Cells(hro, 1) = "<TITLE>" & dai & "</TITLE>"
hro = hro + 1: Cells(hro, 1) = "</HEAD>"
hro = hro + 1: Cells(hro, 1) = "<!-- このファイルは、KIDBhtml" & va & "で作成されました。-->"
'バックカラ−
hro = hro + 1: Cells(hro, 1) = "<BODY BGCOLOR=#ffffbf>"
'表作成
Sheets("Sheet1").Select
tdat = Range("A1").CurrentRegion.Value
rend = UBound(tdat, 1)
cend = UBound(tdat, 2)
'テ−ブル作成
dbas = "<TABLE BORDER>"
表貼付
For i = 1 To rend
Sheets("Sheet1").Select
Application.StatusBar = "HTML変換中---- " & i & "/" & rend
ReDim dt(4)
dt(0) = "<tr>"
For j = 1 To cend
If Trim(tdat(i, j)) = "" Then
tdat(i, j) = " " 'ブランクセルにhtmlブランク
End If
If j < 6 Then
dt(0) = dt(0) & "<td>" & tdat(i, j) & "</td>"
ElseIf j < 12 Then
dt(1) = dt(1) & "<td>" & tdat(i, j) & "</td>"
ElseIf j < 18 Then
dt(2) = dt(2) & "<td>" & tdat(i, j) & "</td>"
ElseIf j < 24 Then
dt(3) = dt(3) & "<td>" & tdat(i, j) & "</td>"
Else
dt(4) = dt(4) & "<td>" & tdat(i, j) & "</td>"
End If
Next
For n = 0 To 4
If dt(n) <> "" Then
dbas = dt(n)
表貼付
End If
Next
dbas = "</tr>"
表貼付
Next
'最終処理
Sheets("Sheet2").Select
hro = hro + 1: Cells(hro, 1) = "</table>"
hro = hro + 1: Cells(hro, 1) = "<BR>"
'更新日
hro = hro + 1: Cells(hro, 1) = "作成日: " & Date & "<BR>"
hro = hro + 1: Cells(hro, 1) = "" & "<BR>"
hro = hro + 1: Cells(hro, 1) = "</BODY>"
hro = hro + 1: Cells(hro, 1) = "</HTML>"
Application.ScreenUpdating = True
Sheets("Sheet2").Select
Application.StatusBar = "保存完了"
msg = "HTMLへ変換完了。"
kesu = MsgBox(msg, 0, "KIDBhtml")
End Sub
'
Sub 表貼付()
Sheets("Sheet2").Select
hro = hro + 1
Cells(hro, 1) = dbas
End Sub
6-3(6) マクロ内での待ち時間設定例
○●●
他のアプリケ−ションを起動した場合等で、マクロ内に待ち時間
を設定する必要があるケ−スがあるが、本項に待ち時間設定例を記述。
[1] 少し時間を取りたい時使用(PCにより時間が大幅に異なる)
For t1 = 1 To 10000
For t2 = 1 To 1000
Next
Next
[2] 3秒間時間を取った例(DoEventsによりアプリケ−ションは読込んでいる)
timck = Timer + 3
Do
If Timer > timck Then
Exit Do
End If
DoEvents
Loop
[3] 10秒のカウントダウンをセルへ表示した例1
tm = 10
tma = tm: tm2 = 0: tim1 = 0
timck = Timer + tm
Do
If Timer > tim1 Then
Cells(1, 1) = tma
tim1 = Timer + 1
tm2 = tm2 + 1
tma = tm - tm2
End If
If Timer > timck Then
Exit Do
End If
Loop
[4] 10秒のカウントダウンをセルへ表示した例2
tm = 10
For t = tm To 0 Step -1
Cells(1, 1) = t
Application.Wait (Now + TimeValue("00:00:01"))
Next
[5] 4秒間待った例
Application.Wait (Now + TimeValue("00:00:04"))
[6] 2分間を監視した例
tim = Now + TimeValue("00:02:00")
Do
If Now > tim Then
MsgBox "タシムオ−バ−"
Exit Do
End If
’-----実行するマクロ(省略) ---------
Loop
[7] 5秒後にプロシージャ"Macro1"を実行
Application.OnTime Now + TimeValue("00:00:05"), "Macro1"
【戻る】 【Top画面】 【HPへ】