2007年8月26日日曜日

第37回目 エクセルのファイルを分析する(その3)

○第37回目 エクセルのファイルを分析する(その3)

 この後は本当にむずかしいです。
 ほとんど一つのシートの内容を説明しなければならないからです。
 そんなこととができるでしょうか。出来るわけがありません。

 私たちのやり方でまずいところは、まずエクセルで頭の中にある何かを作ってしまうことです。そして、文書化せずに、試行錯誤してバグを直して完成品を作り上げてしまうということです。
 もうその段階になったら、詳細な仕組みなど(シートの仕様書という。ほとんど計算式の紹介)書こうという気が起きなくなってしまうのが人情ではないでしょうか。

 それを避けるためには、最初から仕様書ができないうちは、計算式の組み立てをしないということです。といっても、その後計算式を組み立ていくと最初の内容と異なることがあります。そこでさかのぼって仕様書を修正するというのも、おっくうです。
 さてさてどうすればいいでしょうか。

 それは、完成品と思われるエクセルのシートの内容を基に、仕様書を作ればいいのです。
 考え方は非常に簡単です。作ったものから仕様書を作ればいいのだから。
 だが具体化するには定型化されていないだけ、難しいのです。それで日銭を稼いでいれば必死になりますが、通常はそうではありません。

 ということでこのテーマは、大変なものなのです。
 事務屋にとって永遠のテーマかもしれません。
 作り上げたエクセルのシートから、わかる言葉で記述した何らかものが出来ないのか、という叫びとなります。

 答えは不可能です、ということになります。そこを何とかモドキの二乗、三乗、四乗あたりのものが出来ないのか…、ということに、ここでの問題は終息します。

 見方を変えれば、何かできれば儲けものということになります。
 それを行動の根源として、何かいいアイデアはないでしょうか、ということです。
 
 さて、考えて見ましょう。
 材料は横見出しと計算式です。これを使って何か出来ないか…。
 今回は、問題提起まで。

2007年8月25日土曜日

第36回目 エクセルのファイルを分析する(その2)

○第36回目 エクセルのファイルを分析する(その2)

 前回の問題提起の整理
 1.各シート名だけではなく、そのシートの概要を記したコメントも張り付ける。
  (各シートのA1にそのシートの説明を必ずコメントで記入する)
 2.このコメントをテキストエディタで作成し、クリップボード経由で自動的に各シートのA1に貼り付ける。
 という2点でした。

 1.について
 各シートのコメントを配列変数値に格納すればほぼおしまいです。そのやり方ですね。
 結構調べましたが、操作マクロも参考にして、おおむね次のようになりました。
 これはコメントの取得と貼付けの両方となっています。

Range("E5").Select
Set cellcmt = ActiveCell.Comment  'ここがポイント。set文を使う
If cellcmt Is Nothing Then
   mm = ""
Else
   mm = Cells(5, 5).Comment.Text
End If

Cells(15, 5).Select
Set cellcmt = ActiveCell.Comment  'ここがポイント。set文を使うのでした
If cellcmt Is Nothing Then
   Cells(15, 5).AddComment
  Cells(15, 5).Comment.Text Text:=mm
Else
  Cells(15, 5).Comment.Text Text:=mm
End If


 この取得の部分を、for to で包めば完成です
For i = 1 To Worksheets.Count 'シートの数だけ繰り返す。グラフは除く
:
:
Next


コメントは、指定した列に入れておきましょう。
ll005は5という定数の意。

Dim mm(100)  'コメント
Dim nn(100)  'グラフを入れてのシート番号

'コメントを入れる列の指定
  h1 = InputBox("コメントを入れる列を入れてください。", , "i")
  h2 = Range(h1 & "1").Column

'コメントの取得
For i = 1 To Worksheets.Count 'シートの数だけ繰り返す。グラフは除く
Worksheets(i).Select
nn(i) = ActiveSheet.Index
Cells(1, 1).select
   Set cellcmt = ActiveCell.Comment
   If cellcmt Is Nothing Then
     mm(i) = ""
   Else
     mm(i) = Cells(1,1).Comment.Text
   End If
Next

'コメントを貼り付ける
Worksheets(1).Select
For i = 1 To Worksheets.Count 'シートの数だけ繰り返す。
Cells(lr005 + nn(i) - 1, h2) = mm(i)
Next

よく考えると、これは単独のマクロが使い勝手がいいようです。
また、どこに貼り付けたらいいのかを与えたほうがいいと思います(対応済みです)。
シート名を貼り付けるマクロを原形として、コメント張り付けマクロをつくってみてください。
 ※グラフのコメントは手で注記(コメント)を書いていくしかないでしょう。
 ※ワークシートだけでのシート番号を取得するのが出来ません。上記で取得しているのは、グラフを含めた番号となっています。ワークシートの全体の数は、Worksheets.Countで取得可能なのにです。


 2.について
 クリップボードの内容を貼り付けます。
Cells(20, 5).PasteSpecial Operation:=xlPasteAll '貼り付ける
 でよろしいようです。

 しかし、実際には手動で貼り付けて、その範囲を指定した後にマクロを動かすというほうが良いようです。

'座標の取得
AAA = Selection.Address
p1 = InStr(AAA, ":")
AAA1 = Left(AAA, p1 - 1)
AAA9 = Mid(AAA, p1 + 1)
retu1 = Range(AAA1).Column
gyo1 = Range(AAA1).Row
retu9 = Range(AAA9).Column
gyo9 = Range(AAA9).Row

gyo_cnt = gyo9 - gyo1 + 1
retu_cnt = retu9 - retu1 + 1

'コメントの取得
For i = 1 To gyo_cnt
For j = 1 To retu_cnt
mm(i) = mm(i) & Cells(gyo1 + i - 1, retu1 + j - 1) & ","
Next j
Next i

'貼り付けたコメントの削除
Range(AAA).ClearContents

'コメントをA1に貼付け
For i = 1 To Worksheets.Count 'シートの数だけ繰り返す。グラフは除く
Worksheets(i).Select
Cells(1, 1).select
Set cellcmt = ActiveCell.Comment  'ここがポイント。set文を使うのでした
If cellcmt Is Nothing Then
   Cells(1, 1).AddComment
  Cells(1, 1).Comment.Text Text:=mm(i)
Else
  Cells(1, 1).Comment.Text Text:=mm(i)
End If
Next
Worksheets(1).Select

 これでまあまあでしょうか。

2007年8月23日木曜日

第35回目 エクセルのファイルを分析する

○第35回目 エクセルのファイルを分析する

 本当は、こんなだいそれたことはできません、ということでおしまいです。
 それでは面白くないので、話を発展させます。
 
 われわれの業務では、エクセルのシート数がかなり多くなります。
 そして夏休みです。
 この二つのことから連想することは、……

 それは、引継ぎです。
 そのためにエクセルの内容を説明しなければなりません。100%は無理ですが、少なくとも鳥瞰図的なものは必要ではないでしょうか。
 ということで、試行錯誤的にそんなような気にさせるものを作ることに、チャレンジしましょう。これも定式化できないものなので、いいところをとってください。

 シートは何枚あって、シートとシートの関係はどうなっているのか。

 新しいシートを一枚作ります。
 そこに全シートのシート名を一覧表を作ります。
 同じようなグループはまとめ、二重罫線で囲みます。
 見た目アウトライン表記のように、シート名をずらして階層化させます。
 シート名の右側に必要なコメントを書きます。また、図で矢印でつながりを表してもいいですね。
 これは、到底今の力では出来ません。

 それである程度省略してマクロでは、

 1.全シートのシート名を一覧表を作ります。
 2.見た目アウトライン表記のように、シート名をずらして階層化させます。そのためずらす数(ここでは列数とする)を設定します。
 途中で色々な作業が入るので、これは別々のマクロとなります。

 ということだけにします。

 ということでかなり簡単になりました。

 取極めをしておきましょう。
 シート名一覧を作るシートは手動で作りますが、D5からシート名を下に向かって書き込みます。シート番号も必要なので、D列がシート番号、F列がシート名になります。
 (E列はあとで使うので、ずらしています)
 
 メインの処理は次の通りとなります。
 
lr005 = 5: lc004 = 4     '後での修正が楽なように定数は変数化して持つ

Cells(lr005-2,lc004+1) = ActiveWorkbook.Name 'ブック名
  For i = 1 To Sheets.Count 'シートの数だけ繰り返す。グラフを含める
Cells(lr005+i-1,lc004) = i  'シート番号をセルへ記入する
Cells(lr005+i-1,lc004+2) = Sheets(i).Name 'シート名をセルへ記入する
Next

 (注)シート数は、"Sheets.Count"に入っています。
   Sheets.CountのかわりにWorksheets.Countをつかうと、グラフは含まりません。

 これで1.はおしまいですが、さびしいのでリンクを張ってみます。

Cells(lr005+i-1,lc004+2).select
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:= _
Sheets(i).Name & "!A1", TextToDisplay:=Sheets(i).Name

を、nextの前に入れてください。


 2.アウトライン表記的に列下げをする。各シート名ごとに、下げる列数を入力します。E列に入れます。これは手動です。
 マクロの中で1単位ごとの移動列数を入れます。
 列下げ数値の範囲を設定してからマクロを動かします。
 列下げ数値がはいっている座標がわからないので、座標の取得から入ります。

 ・座標の取得
AAA = Selection.Address
p1 = InStr(AAA, ":")
AAA1 = Left(AAA, p1 - 1)
AAA9 = Mid(AAA, p1 + 1)
retu1 = Range(AAA1).Column
gyo1 = Range(AAA1).Row

retu9 = Range(AAA9).Column 'retu1と同じはず
gyo9 = Range(AAA9).Row

 ・挿入するセルの基本単位の入力
tan_i = InputBox("挿入するセルの基本単位を入れてください。通常は1 ", , 1)

 ・セルの挿入
For i = gyo1 To gyo9
kaisuu = Cells(i, retu1) * tan_i
If kaisuu <> 0 Then
For j = 1 To kaisuu
Cells(i, retu1 + 1).Select
Selection.Insert Shift:=xlToRight
Next j
End If
Next i

 これも、これでおしまい。簡単すぎましたね。

 これも簡単すぎましたので、おまけです。

 まずはアイデアのみですが、各シートのA1にそのシートの説明を必ずコメントで記入することを指示するのです。そしてこのコメントを取得して、これも表示するというのはどうでしょうか。横に長くなりますね。折り返して表示で行の高さをフリーにしておくと行が高くなってうまくはいるかもしれません。その分縦長になりますけどね。
 また、コメントを作るという面では、コメントをテキストエディタでつくっておき、クリップボード経由で自動的に各シートのA1に貼り付けるというのも考えられます。これは一旦どこかにクリップボードの内容を貼り付けてからでないと出来ません。現時点ではクリップボードの内容を直接変数値に入れるやり方がわかりませんので。
 コメントの貼り付けと列ずらしの処理の前後関係は悩みますね。列ずらしをしてから、コメントを貼り付けるという順番がよろしいようですね。ということは別マクロとなりますね。

 ということで続きは次回へ。

2007年8月19日日曜日

第34回目 マクロを何を使って作るのか(その4;テキストエディタのマクロ2)

○第34回目 マクロを何を使って作るのか(その4;テキストエディタのマクロ2)

 9. 指定された行数の分をコピー。マイナスも可。
=⇒書き方が繰り返されている場合、前の文書を持ってきて修正しますよね。そのためのものです。マイナスは、語尾から上に数えてというパターンの時の指定です。通常はマイナスの指定のほうが多いのではないでしょうか。
 これもプログラムを見てみましょう。

proc main()
'指定された行数をコピーする。
'作った文章群(MAX100行)をそのままコピーし、それを基に新たな文書を作るためのプログラム
'元文書群から1行あけて、コピペする。
'コピーしたい文章群の最後におきマイナスの数値を入力しても可能。
dim i,j,k,l,n,m  '=⇒QXマクロは変数の定義が必須。他のマクロにも使えるので不要な変数も残っている。
dim p1,p2,p3
dim rr$
dim msg$
dim y_begin
dim y_end
dim mm$[100]
if @hwnd = 0 then exit proc
'現在のカーソル行を取得
y_begin = @ScrLineToCrLine(@Line) '物理行から論理行への変換。物理行は画面で表示されている行
'行数の入力
msg$ = "コピーしたい行数を入力してください。文末の場合はマイナス付き。"
p1 = inputbox(msg$,,-3)
if p1 = 0 then exit proc
if p1 < 0 then
p2 = abs(p1) '=⇒マイナス数値の場合、絶対値をとる
y_begin = y_begin - p2 + 1 '=⇒コピーする最初の行は前にあるのでそれの指定
else
p2 = p1 '=⇒p2はコピーの終了行
end if
@Line = @CrLineToScrLine(y_begin)  '論理的な行数に変換
'メイン処理。
for i = 0 to p2 - 1
mm$[i] = @TextCr$(@Line)  '=⇒その行の内容を取得
@MoveNextLineCr '次の行へ
next
'コピー
@InsertF "\n"  '=⇒改行を書き込むということ
for i = 0 to p2 - 1
@Insert mm$[i] '=⇒文字の書き込み
@InsertF "\n"  '=⇒改行させる
next
@Line = @CrLineToScrLine(y_begin + p2 + 1) '=⇒コピーした文の最初にカーソルを移動する
end proc
※エクセルマクロをやっているので、取り組みやすいと感じると思います。

 10. 指定された行数の行を逆転する。
=⇒たまに行をひっくり返してみたいことがありますよね。そのためのものです。
  OCR変換をしていると前後が逆になっているのがたまにありお世話になっています。

 11. 文末にタブを入れる
=⇒よく考えると、たいしたものではありません。しかしながら、タブをマクロ中でどう記述するのか、結構悩みました。
 
 12. 選択範囲の任意文字数目に、設定した文字を挿入する。
=⇒通常は、行頭に挿入します。例えば、タブN個、スペースN個、決まった文字(○、・など)を挿入するということです。結構重宝しています。エクセルマクロでタブによる文字下げをする場合、範囲を指定してひょっと出来ます(デフォルトがタブを行頭に挿入となっています)。

 13. 空行、空白行の削除
=⇒ホームページからテキストをとってくると、いやに改行が多いですね。そのような場合、無意味な行を削除するものです。

 14. 削除する行数を入れて、その行数を削除する。
=⇒削除の操作タッチを少なくするものです。

 15. 選択範囲の指定した桁数目に、連続する数値列を挿入する。
=⇒マクロを作っていると、変数名の与え方によっては、変数の連番だけ変えたいことがあります。それに対応するものです。

 16. 数値にカンマを挿入(複数行可能)
=⇒フリーの"計算式を計算"を動かす場合、だいたいはカンマを入力しないで計算式をつくり動かします。後でカンマをいれ見てくれを整えるものです。

 17. 範囲内の複数語の置換え
=⇒フリーの"複数文字列一括置換マクロ"の機能を範囲を設定しても可能にしたもの。変更がかったるいので余り使っていません。

 18. 選択範囲の行頭に、'''を挿入する。
 19. 選択範囲の'''を削除する。
=⇒マクロのデバック行の加工用。途中経過をチェックする行をコメント行にするためのもの。一々行の頭に'をいれるのが結構めんどくさかったので作成しました。

 20. マクロの中から定数(特別な記号から始まる)を抜き出しまとめる。
=⇒マクロの中では定数は変数化して使っています。変数定義の漏れがないように、マクロから自動的に抜き出すものです。行数を管理する定数、列数を管理する定数、回数を管理するなどその他の定数と三つに分けて特殊な記号を先頭につけていますので、抜き出し可能なのです。重複分は自動削除します。

 21. エクセルマクロファイルの結合。
=⇒既に説明済み

 22. QXマクロファイルの結合。
=⇒フリーも含め140本ほどありますので、この管理も大変です。これも頭が痛いのです。QXエディタオリジナルのショートカットと小指の思い出でのショートカットがありますので、それを表記しなければなりません。現在は不十分ですが、proc文のあとにコメントとして書き加えようと思っています。すると、procを見出しに設定すれば、その行が一覧表になるので、改めてショートカット対応表を作る必要がないのです。
 このマクロを改良して、複数のテクストファイルを結合する機能も追加しています。あらかじめ、結合するファイルのパス名を書いておき、それを指定してから実行します。結合結果のファイルは、処理のつど事前に削除してから、結合処理するように組み込んでいます。
 スキャナを使ったOCR変換は、各回ごとに1ファイルとなります。それを、結合させる時にも活用しています。フリーの取れたぬ君は非常に便利。

 23. ファイルの履歴取得数拡大。ファイルは400個まで累積する。
=⇒QXエディタでは、60個までの履歴が管理されます。それを拡大したものです。これまでの履歴ファイルに、今回のもの(最大60個)を付け加え、重複するものを削除し、すでに削除されたものは"ファイルなし"の表示を付加しています。ファイル名または更新日付でのソートを可能としています。ファイル数は定数を修正すればもっと拡大可能です。この文書から、該当するファイルを開くことも(一部を除き。対象にできないか研究中)可能です。

 24 ファイルのパス名からジャンプ及びそれ以外のことをする
=⇒テキストファイルに、"C:\Documents and Set\pppp\My Docus\xxxx.xls"いうパス名を書き込んだとします。このファイルを開くということです。
 QXエディタについているのは、テキストファイル及びそれに類するものにジャンプするのですが、それ以外のエクセル、ワードのファイルは開けません。これに対応する機能です。ワード等でいうリンクを張るということと同じです。
 また、"それ以外"のこととは、上のパス名を指定してそのフォルダを開くというものです。上記の例では"C:\Documents and Set\pppp\My Docus"のフォルダがエクスプローラで開かれます。
 もう一つは、そのパスに書かれているフォルダ(ファイルでも可能)を暗号化ソフトで暗号化させることです。当然復号化も可能です。パス名を使ったさまざまなことを組み込んでいこうかと思っています。

2007年8月18日土曜日

第33回目 マクロを何を使って作るのか(その3;テキストエディタのマクロ)

○第33回目 マクロを何を使って作るのか(その3;テキストエディタのマクロ)

 いままでに作成したQXエディタでのマクロを紹介します。
 少しでも、マクロの組めるテキストエディタが重要なのかをわかってもらいたいからです。

【作成したQXエディタでのマクロ】
 1. 文字列から表の作成
 2. 表を文字列に戻す。
 3. 法律の条文から、見出しと条文番号のみを抜き出す。
 4. 法律の新旧対照表から新の条文だけを抜き出す。(一太郎の文書から)
 5. 漢数字をアラビア数字にする
 6. 全文を別の文書にコピーする。
 7. 語尾にそれまでの文字列をコピーする。
 8. 直前の行の一部をコピーする
 9. 指定された行数の分をコピー。マイナスも可。
 10. 指定された行数の行を逆転する。
 11. 文末にタブを入れる
 12. 選択範囲の任意文字数目に、設定した文字を挿入する。
 13. 空行、空白行の削除
 14. 削除する行数を入れて、その行数を削除する。
 15. 選択範囲の指定した桁数目に、連続する数値列を挿入する。
 16. 数値にカンマを挿入(複数行可能)
 17. 範囲内の複数語の置換え
 18. 選択範囲の行頭に、'''を挿入する。
 19. 選択範囲の'''を削除する。
 20. マクロの中から定数(特別な記号から始まる)を抜き出しまとめる。
 21. エクセルマクロファイルの結合。
 22. QXマクロファイルの結合。
 23. ファイルの履歴取得数拡大。ファイルは400個まで累積する。
 24. ファイルのパス名からジャンプ及びそれ以外のことをする

 1. 文字列から表の作成
 2. 表を文字列に戻す。
=⇒テキストエディタは、表作成に弱いです。そこで表作成を簡単にしようというものです。
 具体的には、データとして次のように与え、下のような表を作るというものです。

2 6 10 15   =⇒これは、たて見出しを除いた項目数とそれぞれの列の幅を意味します。主項目は2つ、列の幅は順に、6桁、10桁、15桁ということです。
 年  月   事  項     適  用
2006.12  定期点検 ガス及び電気
2007. 1  親睦行事 会社のレクレーション大会
※項目の間はtab

┏━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃・年・・月・┃ ・・ 事・・項・・・┃・・・・適・・用・・・・・・・┃
┣━━━━━━╋━━━━━━━━━━╋━━━━━━━━━━━━━━━┫
┃2006.11・・┃・定期点検・・・・・┃ガス及び電気・・・・・・・・・┃
┣━━━━━━╋━━━━━━━━━━╋━━━━━━━━━━━━━━━┫
┃2006.12・・┃・親睦行事・・・・・┃会社のレクレーション大会・・・┃
┗━━━━━━┻━━━━━━━━━━┻━━━━━━━━━━━━━━━┛
 (注)ブログでの表示がうまく出来ませんので、スペースの代わりに・にしています。
   それでもだめですね。実際は表は崩れませんので、ご了解を。

 なお、データの与え方はエクセルでのものと同じにしていますので、エクセルでデータを作って、テキストに貼り付けてというやり方が可能です。通常はこのやり方で表を作ります。
 エクセルで作っているのだから、テキストエディタで作る必要がないのではという、こともいえますが、資料の一貫性という観点からエクセルとの間でやり取りをしています。
 2.のマクロは、表をデータに戻すものです。何で必要なのかというと、表での文字、数値の配置が思うように行かない時、表を直接直して、それをデータにとるというものです。横見出し以外は表が崩れてもかまいません。自動的に補正します。

 3. 法律の条文から、見出しと条文番号のみを抜き出す。
 4. 法律の新旧対照表から新の条文だけを抜き出す。(一太郎の文書から)
=⇒これは条文の整理・管理のためのものです。
 今は条文は改正案の段階から磁気媒体化されています。それを簡単に利用可能な形式にしようと思って作ったものです。
 新旧の新の部分だけを取り出すということをしています。一太郎の中では簡単に新旧の分離は出来るのかもしれません。(一太郎は、フリーの一太郎ビューワしか持っていません)
 特殊な条件で新と旧を切り分けていますので、100%は正しく抜き出せません。特に表がある条文は駄目です。
 3.はそのような条文から目次モドキをつくろうというものです。
 新の条文だけに必要性が高いのです。だが、見出しのない条文もありますので、これもなかなか100%の結果にはなりません。

 5.漢数字をアラビア数字にする
=⇒条文上の漢数字をアラビア数字にするものです。これはフリーの『複数文字列一括置換マクロ』を活用したものです。ですから、変換対応表を工夫して作りました。九百九十九条まで可能です。百条、百二条、百二十条、ニ百条をどのような手順で変換しますか。
 頭の体操には面白いです。

 6. 全文を別の文書にコピーする。
=⇒付け加える文章は完成度が低いため色々と修正が必要となります。その部分だけの文書ファイルを作って、完成したらもとの文章に付け加えるという目的で作ったものです。
 テキスト内での場所の移動が楽なことから、それだけ更新操作時間の節約になります。また、もとの文章の指定した場所にコピーするという処理に単純化されてマクロも単純になりました。
 このマクロは短いものなので内容をちょっと見てみましょう。
 ほとんど解説を必要としませんね。
 このプログラムは変数を使わないので、イメージとしては不十分ですね。変数使いはエクセルマクロとそれほど変わりません。

proc main() '=⇒始め
'全文を別の文書にコピーする。  =⇒コメント行
'直前に表示されていたウインドのカーソルのあるところにコピーされる
'起動は2タッチとする
if @hwnd = 0 then exit proc '=⇒始めるときのおまじない
@BlockSelectAll '=⇒全文選択
@BlockClipboardCopy '=⇒クリップボードにコピー
@WindowChange '=⇒別ファイル(直前に処理していたファイル)に変える
@BlockPaste  '=⇒ 貼り付け
end proc  '=⇒終了
※注、QXマクロは、ある前提のもとになっているので、上のものを単純に貼り付けても駄目です。全角スペースを半角に修正する必要があります。よくこれで動かないどうしてだろうと思い悩むことがあります。

 7. 語尾にそれまでの文字列をコピーする。
=⇒同じような文言の繰り返しがある場合、これをコピーし、修正しようという考えです。

 8. 直前の行の一部をコピーする
=⇒これも、よくある例ですが、一行前の文章の後半と同じなので、コピーしたい、という目的です。以下、上と同文ですというような時でしょうか。

 ここらで一休み。

2007年8月13日月曜日

第32回目 マクロを何を使って作るのか(その2;テキストエディタ)

○第32回目 マクロを何を使って作るのか(その2;テキストエディタ)


 【次にエディタでの文書作成効率を目指して】
 次に、このエディタで使えるフリーマクロを取り込み、文書作成の効率化を図りました。基本機能を使いこなして、同じく効率化を図りました。
 また、ショートカットキーの設定が広く出来るので、よく使う機能をショートカットに設定しました。
《フリーソフトから》
  ・トグルキーモード 「小指思い出」=⇒あらたなショートカットルートの開拓
  ・連番自動入力マクロ。
  ・計算式の計算
  ・複数文字列一括置換マクロ
  ・括弧入力マクロ
  ・改行取り取れたぬ君の実行
  ・テキスト高速ソートマクロ
  ・見出し一覧をファイル出力するマクロ
  ・印刷マクロ。複数の印刷書式を簡単に選択
  ・カーソル上の単語で google 検索
  ・エクスプローラの起動


 ここで突然ですが、エクセルマクロの管理について
【エクセルマクロの管理】
 エクセルのマクロの管理方法です。どのように管理していますか。
 数が少ないとたいしたことはないのですが、多くなってきますとうまく管理しておかなければなりません。
 また、マクロを開発している時、修正している時はどのようにしたらいいのでしょうか。状況によりますので答えはないので、各自で工夫ということになりますが、一つの指針として思ってください。
 1.マクロは、一つのエクセルファイルに集中させます。マクロ以外のデータをいれずに、できるだけ軽くしておいてください。
 2.したがって、マクロを動かす時は、必ずそのファイルも開いておきます。
 3.マクロ開発、改修の時はそのファイルのまっさらなモジュールにて行ないます(全文対象が効くためコピーに便利)。プログラム名にはa11とか付加し、マクロを実行させるときに一番上に来るようにします。
 4.マクロの作成はQXエディタで行い、それをモジュールに貼り付けてテストをしたり、QXエディタに貼り付けなおしてマクロを修正したりしします。
 5.完成後も、コメントなどを補完する必要がありますので、それもQXエディタで行います。
 6.バックアップします。そのためモジュールのエクスポートをまめに行ないます。
 7.エクスポートされたモジュールはテキストエディタで開けるので、QXエディタのマクロにより、エクスポートファイルを統合したテキストファイルをつくります(現時点で五千九百行となっています)。QXエディタで、Subを見出しに設定し、見出し一覧でプログラムだけの目次を作り、そこから具体的なマクロを参照できます。
 ※ということで、マクロの作成、モジュールのエクスポート、QXエディタのマクロでの統合、見出し一覧から参照し活用する、ということがQXエディタとエクセルの間で一連で出来てしまうので、管理がらくだと思っています。
 ※統合したファイルは、新しくマクロを作る場合、原型となるマクロを探したり、コマンドの使用例をさがしたりして、活用しています。また、見出し一覧をプリントしてドキュメント化をしています。
 ※基本的なコマンドを抜き出して辞書(普通のテキストファイル)を作ります。QXエディタでは補助入力機能がありますので、その辞書に設定し、マクロの作成に活用します。(フリーソフトでソートのマクロがありますので、それでソートをしています。文言の保管形式は、『見出し"tab"貼り付ける内容』という形式なので、グループ化が可能です)

 つづきです。

《既存のショートカット機能で検索関係》
 ・ F2  マークの検索(下へ)
 ・ Shift + F2  マークの検索(上へ)
 ・ Ctrl + F2  マークの設定・解除
 ・ Ctrl + F4  見出し行の検索(下へ)
 ・ Ctrl + Shift + F4  見出し行の検索(上へ)

 《新たにショートカットに設定した機能》
 ・ Ctrl+ b 一行コピー
 ・ Ctrl+ t 一行削除
 ・ Ctrl+ BackSpace カーソルのある文字以降の文字(一行)を削除
 ・ Ctrl+k マーク一覧表
 ・ Ctrl+ m 見出し一覧表
 ・ Ctrl+ i  日付の貼り付け
 ・ Ctrl+j カーソルのある行に記載(フルパス)されているファイルにジャンプ
 ・ Ctrl+ er 右寄せ
 ・ Ctrl+ em 中寄せ


 【とうとうQXエディタのマクロに】
 更なる文書作成の効率化と、エクセルマクロ作成の効率化のために、QXでのマクロを自作するようになりました。
 作って3回ほどしか使わないものもありますが、それは勉強として考えれば無駄なことではありません。そんなこんなで作ったマクロを数えてみると30ほどになります。
 実例を含めてその中からご紹介します。
 (筆者は仕事においては、文書作成はすべて(100%)QXエディタで行なっています。文書系が中心なので、図形が不要なぶんだけ、ワードが不要となっていることもおおきいでしょう。視覚的なアピールが必要な資料については、エクセル、ワード、パワポで作成することとなると思います。それにしても、かなりの範囲のものをワードではなく、このQXエディタで作成するということです)
 マクロの起動は、原則的に『トグルキーモード「小指思い出」』で2タッチでできるようにしています。
 
 マクロの紹介は次回とします。

2007年8月12日日曜日

第31回目 マクロは何を使って作るのか

○第31回目 マクロは何を使って作るのか

 エクセルのマクロだから、エクセルを開いてVBAのモジュールに書き込んでいきデバックなどをして作るのではないでしょうか。それ以外に何があるのでしょうか。
 一見そのとおりですが、この方法だと、プログラム(マクロ)作成の効率が悪いのです。
 つまり、編集機能がかなり低いのです。
 通常は、テキストエディタでつかって作成し、モジュールに貼り付ける、デバックをするという手法の繰り返しをとるのではないでしょうか。
 それも編集機能がプログラム作成に優れているエディタで、となります。

 ワードでも十分なのでは?
 どうでしょうか。ワードの機能を100%知らないので、確定は出来ませんが、ワードを操作している経験では、プログラム作成には編集機能が弱い、又、遅い。
 プログラムでは文字の修飾とかはまったく不要となりますので、単純にテキストエディタで十分ということなのです。(メモもテキストエディタですが機能が低い)
 
 プログラム作成には強力な編集機能がついているテキストエディタが必要なのです。
 重要な点はマクロが使えるエディタかということです。ワードはそこまで突き詰めていませんので、ワードでもいいのではないかということに対する答えには確証はありません。しかし、そのためにワードの勉強をしようという気は起きません。

 ということで次のホームページを見てください。
 http://www.vector.co.jp/vpack/filearea/win/writing/edit/
 QXエディタ QXエディタ(116)
 秀丸エディタ 秀丸エディタ(215)
 とあります。
 さすが秀丸エディタですね。関連マクロ等で215もあります。
 内容はクリックしてみてください。
 ほとんどは、エディタに対する付加機能とフリーマクロです。

 それはさておき、筆者が使っているのは、QXエディタ※のほうです。
 クリップボード関係のフリーソフトでQTCLIPというのがありますが、それを使っていました。
 ※QXエディタ…シェアウエア(3,255円)
  QXエディタ作者のホームページ…http://0ban.com/araken/
                 http://0ban.com/araken/qxw.htm
  
 【まずはワードの代用で】
 ワードでは動きが遅くまた使い勝手が悪かったので、テキストエディタを探して何回か目に、このQTCLIPの親分格のQXエディタを使うようになりました。そのとき、気にいった機能が"部分印刷"でした。
 (秀丸はとっつきが悪くてやめてしまいました。)
 (※"とっつきがいい、悪い"とは、こちらの常識的な操作で思ったことができるかということです。極めて短期的な主観的な判断です)

《QXエディタの基本機能で特筆すべきもの》
  ・タブ形式のテキストエディタ
  ・短縮入力という長めの登録文字群の一覧表示からの文書への入力
  ・見出しの設定と見出し一覧の作成。指定した見出しへのジャンプ
  ・複数の書式設定が可能
  ・複数の印刷書式が保存可能
  ・部分印刷が可能
  ・インデントが可能
  ・ルビの設定が可能
  ・箱型のコピー、削除
  ・最近使ったテキスト一覧(60個)からの読み込み
  ・IMEへの単語登録
  ・基本操作のショートカット機能設定が可能
  ・マクロが可能

 ※QXエディタ…シェアウエア(3,255円)とありますが、次のホームページも必見です。安く手に入りそうです。立ち読みして確認してください。
 =⇒失礼いたしました。バージョン6.3は旧のものでした。最新はバージョン6.9です。
   他の情報量とあわせていただき、まあよしとしてください。
   
http://takuki.com/edit.htmlより転載。
書 名:『ワードを捨ててエディタを使おう 第2版』
   著 者:鐸木能光
   版 型:A5版単行本 CD-ROM付き
   価 格:2,200円
付属CD-ROM
 正規ライセンス付きQXエディタ(バージョン6.3)、厳選フリーエディタ3本。「エクスプローラ拡張メニュー」など、お勧めユーティリティソフト群。……など、お宝満載の内容。

※鐸木能光…この方の情報(本を含めて)には大変感謝しています。パソコン環境のソフト面の快適さ追求には必須の情報です。
 参考文献…パソコンは買ったまま使うな! -フリーソフトで作る快適環境-

2007年8月9日木曜日

第30回目 大きな表の一部抜粋(その3)

○第30回目 大きな表の一部抜粋(その3)

 さてかなめの処理です。
 使う変数を前回から抜き出してきたので、参照してください。

 見出し関係の数値です
 gyo_m_1=⇒横見出しのはじめの行数
 gyo_m_9=⇒横見出しの最後の行数。プラス+1はデータ部のはじめの行数
 gyo_m_cnt=⇒横見出しの行数
 
 必要とする縦項目の内容=⇒gyo_midashi(50)
 元の表の抜き出す行番号=⇒gyo_no(50)
 必要とする横項目の列記号=⇒retu_kigo_zen(50)
 概略表での横項目の列記号=⇒retu_kigou_go(50)
 必要とする横項目の列番号=⇒retu_no_zen(50)
 概略表での横項目の列番号=⇒retu_no_go(50)
 概略表の行の数(データ部のみ)=⇒gyo_cnt
 概略表の列の数=⇒retu_cnt

 今回の処理の手順は次のようになります。
 1.見出し部の作成(コピー)
 2.データ部の作成
 3.罫線の設定
 
 
 1.見出し部の作成(コピー)
 見出し分は全コピーとしました。そして、1行目からのコピーとしました。1行目から行見出しの始まるまでの情報も必要かなと思っています。
 コピー元のセル範囲を指定して、貼り付け先を指定してコピーです。
 コピー元のセル範囲は、retu_kigou_zen(i)の1からretu_kigou_zen(i)のgyo_m_9となります。
 貼り付け先は該当シートのretu_kigou_go(i)の1となります。
 (シートの選択を忘れずに。)
 コピーの機能をつけて、1からretu_cntまでくりかえします。
 範囲の指定は、列記号を持っているので、Range(retu_kigou_zen(i) & 1 ":"……).selectでいいでしょう。
 もちろん、Range(Cells(1, retu_no_zen(i)), Cells(……)).Select形式でもいいです。
 全コピーは操作マクロの記録でとってください。
 =⇒終了
 
 2.データ部の作成
 データ部は計算式で持ってきます。セルは横見出しと列は同じですが行が異なります。
 計算式は列記号による表記となりますので注意してください。
 また、別のシートのものを使うということも注意です。
 下の例を見てください。
Cells(gyo_m_9 + j, retu_no_go(i)) = "=" & sh01_name & "!" & retu_kigou_zen(i) & gyo_no(j)
 計算式を入れるところは、"cells"で指定します。
シート名の指定は、  sh01_name & "!" となります。
 行を埋めてから次の列へということになりますので、二重のfor文となります。
 上の計算式では、行の繰り返しに"j"を、列の繰り返しに"i"を使っています。
 jは、1からgyo_cntまで、iは、1からretu_cntまで、動かします。
 =⇒終了

 3.罫線の設定
 横見出し部は罫線を含めてコピーしましたので、そのままとします。
 データ部は、周囲の罫線、内部の縦線とします。
 これは範囲を指定して、
Selection.BorderAround LineStyle:=xlContinuous
Selection.Borders(xlInsideVertical).LineStyle = xlContinuous
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
 となります。
 一行目では、周囲の罫線を引きます。
 二行目では、内部の縦線を引きます。
 三行目では、内部の横線を消します。
 データ部の範囲の表記については大丈夫ですよね。
 =⇒終了
 
 ※列記号を列番号に変換する際に、英字の大文字しか考えていなかったので、小文字で指定すると変換されません。
 そこで、指定された列記号に対して次の操作をしてください。
retu_kigou_zen(i) = UCase(retu_kigou_zen(i))
retu_kigou_go(i) = UCase(retu_kigou_go(i))
 Ucaseは大文字にする関数です。元が大文字であってもそのままですので、どちらがはいっているかは気にしなくいいです。

2007年8月5日日曜日

第29回目 大きな表の一部抜粋(その2)

○第29回目 大きな表の一部抜粋(その2)

 これまでで決まっていること。
 gyo_m_cnt=⇒横見出しの行数
 gyo_m_0=⇒横見出しのはじめの行数
 gyo_m_9=⇒横見出しの最後の行数。これにプラス1をすると、gyo_d_0=⇒データ部のはじめの行数

 今回は、'設定値の取得と分析、からです。
 
 ここで大事なことは、対象となる列番号と、行番号は何かです。すなわち、抜いてくる列は何列目なのか、行は何行目なのか、ということです。
 また、指定されているのは、必要な行と"列の対応表"です。どちらが大きいのかわかりませんが、大きいほうに合わせて範囲を指定することになります。
 まずは範囲の座標の分析です。
 三列あります。最初の列は必要な行の値です。次の二列は、列の対応となります。
 まずは配列の変数に設定値を入れましょう。その後で、有効部分を取りだして見ましょう。無効なのはヌルがはいっているところからです。最大値は50ほどでいいでしょう。
 与えられた座標の分析を行い、その結果を次の変数に入れてください。
 行の数と列の数は、ヌルが入っている前のところですので、ヌルかどうかをききながら求めてください。
 gyo_midashi(50),retu_kigou_zen(50),retu_kigou_go(50)
 gyo_cnt,retu_cnt

 列の対応=⇒列番号へ変換する。
 今度は列の対応です。これも、それぞれ列番号に直して配列変数で持っておきましょう。これの変換の仕方は、前にやりましたので省略します。
 retu_no_zen(50),retu_no_go(50) 

 次は"行の対応"です。
 これも結構面倒ですね。
 必要な年度が入っている列は、第一行目の列となります。
 retu_no_zen(1)
 元の表の抜き出す行番号も配列変数でもっておく必要があります。必要な年度(gyo_midashi(i)にはいっています)をもとに元の表に戻り、行数をさがします。データ部は横見出しの最後の次の行からとしますので、そこから、最大でも1000行はないと思いますので、その範囲で探していきます。該当年度があれば抜け出ますので、最大値は処理時間には関係ありません。
 次の数値も、最初から探していったらどうでしょか。たいした時間ではないです。
 gyo_no(50)
 
 やっとこれで準備が整いましたので、表の作成となります。
 また、表を作成した後で、罫線を引くことにします。罫線は周りと縦線のみとします。横見出し部とデータ部との間の横線は引くことにします。
 
 今回はポイントだけですので、結構埋めるものがあると思われます。
 
 残りは、次回とします。

2007年8月4日土曜日

第28回目 大きな表の一部抜粋

○第28回目 大きな表の一部抜粋

 大きな表の一部抜粋して説明用に表を作るという時があります。
 このテーマを考えて見ます。
 一部抜粋という意味ですが、これは、一部の列及び行のみについて対象とした表を作るということです。
 縦に年度が展開されていて、横に諸々の項目が展開されているの表を思い浮かべてください。この例で話をしていきます。
 テーマを言い換えれば、毎年度はうるさいので、五年ごとの表とする。また、横項目も全部はうるさいので概略がわかる程度の項目のみとする、説明用の表を作る、ということになります。
 必要な年度と、項目をどう与えますか?…
 必要な年度の一覧と横項目を表す列の対応表となるでしょうか。
 横項目の見出しは、元の項目のものをそのままとしましょうか。
 すると、横見出しの入っている行数の範囲が必要となります。
 横見出し作りとデータ部作りとなりますが、
 単純に
  Cells(移動先の座標) = Cells(元の座標)
 の繰り返しということになります。
 元の表の内容が変わった場合のことを考えて、式で与えてみましょうか。
 すると、
  Cells(移動先の座標).Formula = "元の座標"
 となります。
 更に変化技をつけて、違うシートから持ってくるというのはどうでしょうか。
 すると、元データのあるシート名が必要となります。
 
 入力データを、まとめて見ますと
 1.元データのあるシート名
 2.元データの表の横項目見出しの範囲(行数のみ)
 3.概略表を作るシートの指定
 4.元データの表のうち必要とする縦項目の内容(行数はイメージがつきづらいので実際の年度で与える)
 5.元データの表のうち必要とする横項目の列と新しい表の列との対応。
 4及び5は、新しい表を作るシートの一部に作っておくことになります。
 
 面倒を省くため、一番、二番は自動的に行ないます。ですから、元表のあるシートで、二番の範囲を指定した後、マクロを動かしてください。
 二番の指定は、行数のみが必要なので一列だけで結構です。

 軌道修正したので、これまでのことを整理しますと、
 新しいシートには、三番目と四番目をセットしておいて、元表のあるシートで二番の指定をして、マクロを動かす、ということになります。
 また、その後の処理は、概略表を作るシート(元表と同じシートでも可能とします)を指定し、その中の三、四番目がセットされている範囲を指定することになります。


Sub a15詳細な表の概略版を作る()
'元表のあるシートで、横見出しの範囲を設定してから実行。行数のみ必要なので一列でよい。
Dim セル範囲 As Range
Dim CCC As Object

'シート数、元表のシート名、シート番号、セルの範囲を取得
sh01_name = ActiveSheet.Name
ii_max = ActiveWorkbook.Worksheets.Count
ii0 = ActiveSheet.Index
rrcc1 = Selection.Address

'横見出しの行を取得
 p1 = InStr(rrcc1, ":")
 rrcc11 = Left(rrcc1, p1 - 1)
rrcc19 = Mid(rrcc1, p1 + 1)
gyo_m_1 = Range(rrcc11).Row
gyo_m_9 = Range(rrcc19).Row
gyo_m_cnt = gyo_m_9 - gyo_m_1 + 1

'シートの移動。同じシートに作りたい場合は、0を入力する
Do
flag = 0
sh_suu = InputBox("新しいシートの場所を入れてください。… -1 , 0 , 1 …など", xpos:=2000, ypos:=3000)

'シートオーバーなどの場合の歯止め=⇒再入力
If ii0 + sh_suu > ii_max Then flag = 1
If ii0 + sh_suu < flag =" 1"> 0

Sheets(ii0 + sh_suu).Select

'設定値の取得
Set セル範囲 = Application.InputBox(Prompt:="設定値のあるセル範囲を選択してください", Type:=8)
rrcc2 = セル範囲.Address
sh09_name = ActiveSheet.Name

'これまでの処理の確認
MsgBox ("範囲は " & rrcc1 & " --- " & rrcc2)
MsgBox ("シート名は " & sh01_name & " --- " & sh09_name)

'設定値の取得と分析

End Sub


『'設定値の取得と分析』以降は次以降にします。