5.[他2]自動リンクの反映確認メッセ−ジ
[1999/10/11 K.Kさんからの質問]
はじめまして。 何枚かのシートを一つにまとめブックにした所、どのシートか解らないんですが
リンクしていて開く度に「反映しますか・・・」と言うボックスが開きます。
非常に気になり、何とか解らないものかと思い本も買いましたが(500連発も)
マクロで探す記載(サンプル等)はありません。良ければ教えて下さい。
宜しくお願い致します。
シートの内容ですが仕事で使っています。 多少マクロは使えます。
シート枚数約90枚。お忙しいと想いますが、簡単に解る方法を教えて下さい。
宜しくお願い致します。
このダイアログが勝手に表示され非常に気になる。
と言う意味でよろしいでしょうか?
私もイライラした経験があり、表示しないようにしている。
-------------------------------------------------------------
(1)一番簡単な表示させない方法。
[ツ−ル]→[オプション]→[編集]で、(リンクの自動更新前にメッセ−ジを表示する)
のチェックマ−クを外せばよい。
-------------------------------------------------------------
(2)リンク元を調べ必要がなければリンクを外す。
対象のブックを開いてから、メニュ−の[編集]→[リンクの設定]を選択すれば
そのブックが何処とリンクしているかダイアログボックス内に表示されます。
ただし、リンクがどのシ−トのどのセルに記述してあるかは判らないので
後は自分で考えるしかない。
-------------------------------------------------------------
(3)マクロでリンク元を調べ必要がなければリンクを外す。
上記の(2)項と同じような事を下記マクロでもできる。この場合も
リンク元は判るが、それがどのセルに書いてあるかは判らない。
Sub Macro1()
Dim linname As Variant
linname = ActiveWorkbook.LinkSources(xlLinkTypeExcelLinks)
If IsEmpty(linname) Then
MsgBox "ExcelLinkは設定されていません"
Else
MsgBox linname(1)
End If
End Sub
-------------------------------------------------------------
(4)リンク記述のあるシ−トを探すマクロ
質問ではシ−トが90枚とのことで、どのシ−トにリンクがあるか探すのが
大変と思いシ−トを探す下記マクロを作りましたので参考にして下さい。
このマクロではリンクの記述してあるセルも表示します
なお、リンクがオブジェクトの場合は(xlLinkTypeExcelLinks)→
(xlLinkTypeOLDLinks)に変えて実行して下さい。
Sub Macro2()
ActiveWindow.WindowState = xlNormal
For Each sheet_name In Worksheets
snam = sheet_name.Name
Sheets(snam).Copy
linname = ActiveWorkbook.LinkSources(xlLinkTypeExcelLinks)
If IsEmpty(linname) Then
ActiveWorkbook.Saved = True
ActiveWorkbook.Close
Else
linn = Right(linname(1), 6)
ActiveSheet.UsedRange.Select
Set actv = Selection.Find(linn, , , xlPart, xlByColumns)
If actv Is Nothing Then
Else
actv.Select
r = ActiveCell.Row
c = ActiveCell.Column
End If
MsgBox "このシ−トにリンクがあります" & Chr$(10) & _
"シ−ト名は " & snam & Chr$(10) & _
"リンク元は " & linname(1) & Chr$(10) & _
"リンクの記述セル(" & r & "行、" & c & "列)"
ActiveWindow.WindowState = xlMinimized
End If
Next
End Sub
"linn = Right(linname(1), 6)"で右から6文字をリンク元のファイル名にしていますが、
セル位置を上手く検出できない場合は、ちゃんとしたファイル名抽出マクロを追加すること。
6.[037]ファイルが開いているか調べ開いていなければ開く
[1999/10/11 K.さんからの質問]
はじめまして。先日、技術評論社から出版されているExcelVBAマクロ500連発を購入し
読ませていただきました。いろいろ分からなかったことが分かり、大変満足しています。
037のマクロと似ているんですけど分からないことがあります。お時間がありましたら教
えてください。
「コンボボックスとコマンドボタンを配置したフォームがあります。
コンボボックスにはエクセルの既にあるファイルの名前が入ってます。(すべて同一
フォルダ−内)コンボボックスからファイル名を選択し、コマンドボタンを押すと既に
ファイルが開いているかどうか調べて、開いてなかったら開く。」
お忙しいところすみませんけどよろしくお願いいたします。
今回フォ−ムから指定したデ−タの取得は出来ている前提で返答します。(なお、
もしフォ−ムからの取り出しも必要でしたら返事を書きますので再度メ−ルを
下さい)。
下記マクロで殆ど問題ないと思いますが、ファイルの名前に拡張子が付いていない
場合は付加します。又下記の変数"fil2"はファイルを開くためにフルパスの
指定が必要です。(下記例の変数"fff"はフォ−ムから取得したファイル名)
Sub ki37()
fil2 = "C:\tst\" & fff & ".xls" 'フォルダ−名を変更し使用の事
fil2a = fff & ".xls"
fila = 0
For Each file_name In Windows
If file_name.Caption = fil2a Then
Windows(fil2a).Activate
fila = 1
End If
Next
If fila = 0 Then
Workbooks.Open Filename:=fil2
End If
End Sub
7.[他3]EXCELのページ違反への対処方法
[1999/10/12 T.さんからの質問]
「EXCELマクロ500連発」購入しました。参考にしています。
欲をいえば、注釈文(考え方)がもう少し欲しい気がします。
ところで、私のEXCELのVer.は、EXCEL2000ですが、マクロ作成中(ある
マクロの修正実行後)EXCELのページ違反です。モジュール EXCEL.EXE
アドレス・・・・」と表示され、STOPします。原因はなんなのでしょうか?マクロの書き方
(処理の手順・考え方)がまずいのでしょうか?
対処方法等、ありましたらアドバイスの程よろしくお願いいたします。
「EXCELのページ違反」メッセ−ジへの対処方法の質問ですが、私自身もこのメッセ−ジは
よくでるが大体何かエラーになる原因があります。ケースにより異なるため回答できません。
なお、もし必ずこのメッセ−ジが出でるマクロがありましたらそのマクロをテキスト文で
送って下さい原因を考えてみます。(知らない方からのメ−ルはウイルスチェック済みか
判らないので、マクロ例はあくまでもテキストでお願いします)。
8.[他4]prn保存で最終にスペ−スを入れる
[1999/10/24 K.Sさんからの質問]
はじめまして。先日500連発を購入しました。大変参考になりました。エクセル初心者の
私にも大変わかりやすい内容でした。 突然なんですが、仕事柄(8月から某企業の開発担当
になってしまいました。資格もないのに・・・。)いろんな人のデータを変換したりすること
が多いのですが、次のようなデータをテキスト形式に出力するときはどのようにVBAをくん
だらよいのでしょうか?教えてください。
データ形式は "1","2","3","4","5"," "(最後は5バイトのスペースです。)
と並んだCSV形式のデータをエクセルで読み込んで "A0001","A0002","A0003","A0004","A0005"," "
と行ったデータに、表示形式で画面に表示させています。これを
A0001A0002A0003A0004A0005 (最後に5バイトのスペースをつけてあります。)
というテキスト形式(固定長)でファイルに保存するマクロを考えているのです。
現在、先の"A0001","A0002","A0003","A0004","A0005"," "と並んだシートをPRN
(スペース区切りテキスト形式)で出力して形は A0001A0002A0003A0004A0005 となっているの
ですが、肝心の最後の5バイトのスペースが勝手に省略されているのです。
ダンプを取ってみると"5"の次には"0D0A"と改行コードが入ってしまっていて見事に長さが
足りなくなってしまっています。これをなんとか固定長のテキスト形式で出力することはで
きないものでしょうか。
勝手な質問で申し訳ないのですが、知恵の足りない私を助けてやって下さい。お願いします。
◆上記の質問ですが、もしA0001が”セルA1”A0002が”セルA2”と言うように
各セルに入っている場合はそれをprnで保存して最終にスペ−スを付けるのは
出来ないと思います。(最終のスペ−スをデ−タの終わりと見てしまうため)
◆しかし、下記のようにデ−タに直してセル(通常A列)に入れば、prnでも最終に
スペ−スを入れる事は可能です。(なお、Chr$(13)はたしか改行だと思ったが
覚えていたのを適当に書いたが、必要なコ−ドに変えて下さい)
sss = Chr$(&h20) & Chr$(&h20) & Chr$(&h20) & Chr$(&h20) & Chr$(&h20) & Chr$(13)
Cells(1, 1) = "A0001A0002A0003A0004A0005" & sss
◆なお、特にPRNでなくてよければ、その行の最終セルにスペ−スを入れ(入れ方は
上記のChr$(&h20)でもキ−ボ−ドからスペ−スを入れてもどちらでもよい)txt又は
CSVとちらで保存しても最終にスペ−スを入れる事は出来る。
◆質問の内容と返事が合っているか判らないが参考にして下さい。なお、prnで保存
する場合Excelのバ−ジョンにより保存された内容がことなります。詳しくは私の
HPの23-11項に書いてあります。
9.[他5]読み取り専用ファイルの判断
[1999/11/09 G.Kさんからの質問]
技術評論社のEXCELVBA 500連発 を日々活用しており、
とても役に立っております。
さて、まことに勝手な質問で申し訳ありませんが、誰に聞いて良いやら
わからず、メールを書かさせていただきました。
<質問内容>
エクセルのブックを開くとき、もしくは開いたあとactive状態のとき、
そのブックが「読み取り専用」かどうかを判断する方法を教えていただけ
ないでしょうか。
もし、「読み取り専用」であれば、終了させるため、判断箇所はどちら
でもかまいません。
<判断が必要な理由>
ファイルサーバ上のエクセルファイルに対して、更新を行うためのマク
ロを作成しているのですが、他の誰かが開いているときは、メッセージを
出して、処理を終了する必要があります。なぜなら、更新するファイルは
複数あるため、クローズするときにメッセージが出ても、そのときでは、
整合がとれなくなるからです。わかる範囲でかまいません、よろしくお願いいたします。
下記の"fck1"はダイアログからファイルを指定し読取専用チェックする(ファイル
は開かないので開いているブックを指定しても特にエラ−にはならない)
"fck2"は既に開いているファイルを対象にチェックする。なおどちらのマクロも
フォルダ−に保存させているファイルそのものチェックしているのであり
本質的な内容は同じです。
Sub fck1()
fff = Application.GetOpenFilename(Title:="ファイル名指定")
dat = GetAttr(fff)
If dat = 1 Then
MsgBox fff & "は読取専用ファイルです"
Else
MsgBox fff & "は読取専用ファイルでは有りません"
End If
End Sub
'--------------------------------------------------------------------------
Sub fck2()
Application.ScreenUpdating = False
For Each file_name In Windows
Windows(file_name.Caption).Activate
dat = GetAttr(ActiveWorkbook.FullName)
If dat = 1 Then
MsgBox ActiveWorkbook.FullName & "は読取専用ファイルです"
Else
MsgBox ActiveWorkbook.FullName & "は読取専用ファイルでは有りません"
End If
Next
End Sub
※ 参考掲載(1999/11/20)
下記"bbb1"はファルダ−「My Documents」のファイル「Book3.xls」を読取専用
に設定、"bbb2"はそのファイルを標準に戻した例
Windowsから設定・解除は「マイコンピュ−タ」「・・フォルダ」(ファイル選択
:右クリック)「プロパティ」「全般」属性の「読み取り専用」のマ−クを
外す(又は付ける)。
Sub bbb1()
SetAttr "c:\My Documents\Book3.xls", vbReadOnly
End Sub
Sub bbb2()
SetAttr "c:\My Documents\Book3.xls", vbNormal
End Sub
上記は<質問内容>の返事にはなっていますが、サーバのファイル
を多数の方が開いたケ−スでは、開いたファイル、又は誰かが開いているかチェック
する必要があり上記マクロでは上手く行きません。下記で識別できる
下記マクロはOpenステ−トメントで「書き込み可能」を指定し
もし既に誰かが開いているとエラ−になる事を利用しチェックしました。
誰も開いていない場合は通常に開き、使用中の場合はメッセ−ジが出て
開きません。
Sub fck3()
fff = Application.GetOpenFilename(Title:="ファイル名指定")
erck = 0
On Error GoTo errcheck
Open fff For Binary Lock Read Write As #1
Close #1
If erck = 1 Then
MsgBox fff & " は使用中です" & Chr(13) & _
"後で再度起動してください。"
Else
Workbooks.Open Filename:=fff
End If
Exit Sub
'
errcheck:
erck = 1
Resume Next
End Sub
10.[他6]テキストファイルのマクロ処理
[1999/11/23 T.Nさんからの質問]
500連発等を参考にしたりして、色々試行錯誤して1999/10当の値の代入後
にオートフィルで実行出来るようになりました。前後の年に渡る処理も出来ま
した。もちろんアドバイスしていただいた事も実行してみました。ありがとうござ
います。HPをみるとカウンターがもう少しで、10万になりますね、私もこのペー
ジが更新されるのをいつも楽しみにしています。
さて、今回の質問ですが、TXTファイルの読み込みについてはEXCEL2000等でも外部
データの取り込みという方法でありますが、TXTファイルでの書き出しはどう
したらよいのでしょうか?
-------------------------------------------------------------------------
[1999/10/30 S.Tさんからの質問]
テキストファイルに連続してデ−タが入っていますが、その車の状況により、
エアコンの項目はある場合と無いケ−ス(空白でなく詰まっている)があります。
また特記事項も1行の場合から多い場合は5行になります。
何とかやって見ようとここ1ヶ月程、自分で考えて見ましたが僕の知っている
エクセルの知識はたかがしれていますのでギブアップ致しました。
井領様のもっておられる知識で解決可能であればご協力の程、何卒宜しくお願い
致します。もちろん報酬はお支払いさせて頂きます。
------------------------------------------------------------------------
[1999/10/24 K.Sさんからの質問]
次のようなデータをテキスト形式に出力するときはどのようにVBAをくん
だらよいのでしょうか?教えてください。
データ形式は "1","2","3","4","5"," "(最後は5バイトのスペースです。)
・・・・<この内容は8項に記載済み>
上記の様に何故か最近一ヶ月の間にテキストファイルに関する質問が3件ありました。
自分のHPで「目次の検索」から「テキスト」を入力して検索して見たら、
テキストファイルの記載は1項目も無かったのでここに記述する事にしました。
なお、"Input#"ステ−トメントでブックを開かずファイルを読み込むケ−スは、
昔N-BASISのプログラムを仕事で飽きるほど作りましたが、その時は全て
"Input#"で読み込んでおりExcelVBAもやり方は同じです。そんな訳でHPにテキストファイル
処理の記載が無かったが実は得意分野です。したがって上記2番目のような報酬付き質問
は歓迎して受けます。
(1)テキストファイル形式
テキストファイルはファイルサイズが非常に小さく、又E−メ−ルで送った場合も
特別なアプリケ−ションが入っていないPCでも開くことが出来る汎用性の高い
便利なファイル形式である。
文書ファイルをExcelワ−クシ−トのセルへ規則正しく読み込むことはできないが、
下記2つの形式のどちらかのになっている場合ワ−クシ−トへ読み込むことが出来る。
[1]区切り文字ファイル(個々のデ−タ・1行のサイズが異なっていてもよい)
・フィルドデ−タが何らかの文字(記号)で区切られている
・区切り文字は、カンマ(,)、タブ、セミコロン(;)、スペ−ス等
[2]固定長フィ−ルドファイル(列毎のサイズが同じ、したがって1行のサイズも同じ)
・例:第1デ−タ4文字、第2デ−タ6文字、第3デ−タ10文字、第1デ−タ7文字等
・上記例では1行(レコ−ド)は常に27文字となる
※ 通常レコ−ドは、行変えChr$(13)で区切られている。
(2)テキストファイルを開く
下記マクロはテキストファイルを自動記録した例(ファイル名のみ変数fil2にしてある)
である。テキストファイルを開く場合マクロは自動記録できるのでそのまま使用すれば
特に問題ありません。
Sub Macro1()
Workbooks.OpenText Filename:=fil2, StartRow:=1, _
DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _
Comma:=True, Space:=False, Other:=False, _
FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), _
Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1))
End Sub
上記マクロの内容を理解していれば、自動記録を編集して使用できます。
[1]StartRow→取り込み開始行を指定。1行目からの場合省略可(既定値1)
[2]DataType→デ−タ形式
・xlDelimited:テキスト形式が区切り文字でフィルドが区切られている
・xlFixedwidth:固定長文字列のテキストファイル
[3]TextQualifier→文字列の引用符(「"」、「'」、「なし」の指定で省略可)
[4]ConsecutiveDelimiter→連続した区切り文字指定(Falseの場合余分な空白付く事あり)
[5]Tab→True:「TABコ−ド」をフィ−ルド間の区切り文字として認識
[6]Semicolon→True:「;」をフィ−ルド間の区切り文字として認識
[7]Comma→True:「,」をフィ−ルド間の区切り文字として認識
[8]Space→True:「スペ−ス」をフィ−ルド間の区切り文字として認識
[9]Other→True:「OtherChar」で指定の文字をフィ−ルド間の区切り文字として認識
[10]FieldInfo→レコ−ド(1行)中の各デ−タの形式を指定
・例:Array(3, 1)は、3番目のデ−タは1(一般)を指定
・1:一般、2:文字列、3〜8:日付(各形式)、9:その行をスキップ
・本例のように形式の指定が全て1(一般)の場合意味がないのでFieldInfoの指定は不要
・一般で読み込むと"001"が"1"になるので"00"を付けたい場合は文字列2を指定
-------------------------------------------------------------------------
上記マクロの必要な項目のみ指定すると下記となる。
Sub Macro1()
Workbooks.OpenText Filename:=fil2, DataType:=xlDelimited, Comma:=True
End Sub
(3)固定長フィルドファイルの読み込み
固定長フィ−ルドファイル(DataType:=xlFixedwidth)にした場合、"FieldInfo"で
各デ−タの区切り位置を指定できる。下記例は区切り文字のないテキストを
1フィ−ルド5文字ずつ(含む空白)読み込んだ例。
Sub Macro1()
fil2 = "C:\My Documents\Book2.txt"
Workbooks.OpenText Filename:=fil2, DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 2), Array(5, 2), Array(10, 1), _
Array(15, 1), Array(20, 1), Array(25, 1))
End Sub
(4)テキストファイルの保存
'カンマ区切りCSVファイルで保存
Sub Record1()
ActiveWorkbook.SaveAs Filename:="C:\My Documents\Book1.csv", _
FileFormat:=xlCSV, CreateBackup:=False
End Sub
'
'タブ区切りテキストで保存
Sub Record2()
ActiveWorkbook.SaveAs Filename:="C:\My Documents\Book1.txt", _
FileFormat:=xlText, CreateBackup:=False
End Sub
'
'スペ−ス区切りPRNファイルで保存
Sub Record3()
ActiveWorkbook.SaveAs Filename:="C:\My Documents\Book1.prn", _
FileFormat:=xlTextPrinter, CreateBackup:=False
End Sub
上記で保存したファイルを、(2)のOpenTextで開く場合は拡張子を「txt」に変えて実行する。
(5)テキストデ−タの読み込み(デ−タ行数不規則)
・左図のようなtxtファイルを上図のようにワ−クシ−トへ読み込む。
・ACの項目は無い場合もある。
・特記事項の説明文の行数は不特定
Sub Record1()
'txtデ−タ取り込み
i = 1: j = 0: keis = 3: toki = 1: shoki = 0
Open fff For Input As #1
j = 14
Do Until EOF(1)
Input #1, dat
'出品no
If j > 12 Then
keis = 1
toki = 0
j = 1
End If
'AC空白
If j = 4 Then
data = Left(dat, 1)
If data > Chr$(&H40) And data < Chr$(&H7B) Then
keis = 3
Else
Cells(i, 5) = ""
j = j + 1
keis = 3
End If
End If
'特記事項
If toki = 0 Then
If j > 7 Then
s1 = InStr(1, dat, "/", 1)
If s1 > 0 Then
s2 = Mid(dat, s1 + 1, 2)
If Val(s2) <> 0 Then
keis = 3 '特記事項終了
toki = 1
End If
End If
If toki = 0 Then
keis = 2
Else
If kesi <> 1 Then
keis = 3
End If
End If
End If
End If
'セルへ書き込み
Select Case keis
Case 1
j = 1
i = i + 1
Cells(i, j) = dat
keis = 3
Case 2
Cells(i, j) = Cells(i, j) & dat
Case 3
j = j + 1
Cells(i, j) = dat
End Select
Loop
Close #1
End Sub
(6)テキストデ−タの読み込み(デ−タ行数一定)
デ−タ行数が一定(下記例では常に14行目が新しいデ−タ)の場合は、
下記例のような簡単なマクロでブックを開かないでデ−タを取込める。
Sub Record1()
Dim dat(13) As String
'txtデ−タ取り込み
i = 1: j = 1
Open fff For Input As #1
Do Until EOF(1)
Input #1, dat(1), dat(2), dat(3), dat(4), dat(5), dat(6), _
dat(7), dat(8), dat(9), dat(10), dat(11), dat(12), dat(13)
'セルへ書き込み
For j = 1 To 13
Cells(i, j) = dat(j)
Next
i = i + 1
Loop
Close #1
End Sub
11.[他7]ビンゴゲ−ム
[1999/12/21 H.Tさんからの質問]
「Excel VBAマクロ 500連発」 (技術評論社)
書店で拝見し、衝動買いしてしまいました。
すばらしいです。
ソースをコピーして使えるのは楽です。
しかし、私はマクロは今月興味を持ち始めたばかりなので、使える物は全く作れません。
今度の同級会(H12/1/3)で幹事長を任されまして、ビンゴゲームを盛り上げるために、PCをルーレットに
使ってプロジェクタ(手配済み)で大写してに数字を表示したいと考えたのが切っ掛けなのです。
市販アプリケーションと家庭用ゲームソフトを手分けして探していますが、見つ
かりません。
ほしい機能は
@普通のランダムによる数字表示
Aあらかじめ仕込んでいた順番の通りに数字が出る。(予め当たるカードを仕込める)
Bビンゴカード一式をカラー印刷出来る。(無くても良い)
依頼の件、
2000サンプル[10]KIbingoへ掲載したので使用して
下さい。
上記の@については乱数を使用したランダム表示を2種類作りました(抽選後拡大表示)。
その他アミダくじも作成したので、自分のカ−ドにあり欲しい数字をセルへ記入して頂き
抽選する方法も可能です(勿論横線は自由に追加できる)。
Aについてはランダム抽選2種類のうち一つでは仕込んでおいた数字が出るようにしました。
BについてはA4用紙に4カ−ド印刷できます。その他改善点はメ−ルを頂けば暇があれば対応します。
【戻る】