「etTomioのトホホ日記」 2011年4月        

◆2011/4/26
 本日0時よりマイクロソフトからIE9の正規版がリリースされています。私はWin7には64ビット版、Vistaには32ビット版を入れました。残念ながらXPにはインストールできません。使い勝手はまだ検証していませんが、少なくとも製品候補版よりはいいでしょう。なおIE9は3/15にリリース予定でしたが、大震災に考慮して通信インフラの負荷を懸念し、今日まで延期したそうです。
◆2011/4/26
 昨日コードの改竄が終わったという「新幹線検索システム」の顔です。16年も前から、雑誌を持っていながら、そして新幹線という興味のあるプログラムなのに、実に長い日を要しました。プロの書いているコードを20行ぐらい削除した箇所もあります。
   
◆2011/4/25
 今から16年も前のExcel5の参考書から、「新幹線検索システム」を時刻表を見ながら、東海道、山陽、九州と全てデータを手入力し、プロの作ったシステムを改竄していました。
 でも、現在のExcelはフォームはダイアログシートからは作りません。新たに入力フォームは震災前に作っていました。でもプロの作ったコードは書き換えられないでいました。所詮、オレはちっちゃな会社のコードを土日に書く程度か・・・ プロには全く歯が立たない・・・ 焼酎飲んだら天才プログラマーなんて言いながら・・・ オレの頭では無理だ・・・
 そして震災。田んぼ作業以外は引きこもりみたいな土日を過ごしていましたので、読書するぐらいで、プログラムからは離れていました。たまにはプロの書いたコードを読んでみましたが、全く・・・
 オレの能力はその程度かと、先日の土日は、コードを1行ずつ調べ始めました。ダミーを作ってテストしてみたり。その都度書き換え、書き換え・・・
 昨日夕方にはかなり書き換えました。そして今日の早朝、会社で用事を済ませ、6時過ぎから7時頃まで・・・ ほぼ書き換えました。
 この経験から思うことは、プロってのは簡潔に無駄なく流れるようにコードを書いている。これが16年も前に書かれたコードか という驚嘆、この勉強はいつか生かしたいと思います。
 下に主要コードを書いています。
◆2011/4/25
Option Explicit

Const 最大抽出数 = 500
Const 条件範囲先頭行 = 991
Const 抽出範囲先頭行 = 1001

Dim 検索結果 As Worksheet
Dim 上り列車本数, 下り列車本数


Private Sub CommandButton1_Click()
'新幹線検索システム 2011/4/25 ettomio

Dim 駅数
Dim 始発駅番号, 終着駅番号, 時刻表名, 条件行
Dim 該当列車本数, 列車名
Dim 列車総本数
Dim 時刻表 As Worksheet
Dim データ範囲 As Range, 条件範囲 As Range, 抽出範囲 As Range
Dim 並べ替え範囲 As Range, 並べ替えキー As Range
Dim X1, X2, Y, I


' 画面の描画を止める
Application.ScreenUpdating = False

' 列車本数を数える
上り列車本数 = Application.CountA(Range("時刻表上り!$A$2:$A$500"))
下り列車本数 = Application.CountA(Range("時刻表下り!$A$2:$A$500"))
' 駅数を数える
Worksheets("時刻表下り").Activate
駅数 = Range("駅名").Columns.Count
' 「検索結果」ワークシートをクリアする
Set 検索結果 = Worksheets("検索結果")
検索結果.Activate
Y = 検索結果.Range("列車種別").Row
X1 = 検索結果.Range("列車種別").Column
X2 = 検索結果.Range("終着時刻").Column
検索結果.Range(Cells(Y, X1), Cells(Y + 最大抽出数, X2)).Clear
検索結果.Range(Cells(Y, X1), Cells(Y + 最大抽出数, X2)).Interior.ColorIndex = 15
' ダイアログボックスでの入力結果を「検索結果」ワークシートにセット
始発駅番号 = D_始発駅.ListIndex
終着駅番号 = D_終着駅.ListIndex
検索結果.Range("始発駅").Value = D_始発駅.List(始発駅番号)
検索結果.Range("終着駅").Value = D_終着駅.List(終着駅番号)
検索結果.Range("始発駅2").Value = D_始発駅.List(始発駅番号)
検索結果.Range("終着駅2").Value = D_終着駅.List(終着駅番号)
検索結果.Range("始発時刻自").Value = E_始発時刻自.Text
検索結果.Range("始発時刻至").Value = E_始発時刻至.Text
検索結果.Range("終着時刻自").Value = E_終着時刻自.Text
検索結果.Range("終着時刻至").Value = E_終着時刻至.Text
' 運賃/料金を「検索結果」ワークシートにセット
検索結果.Range("運賃").Value = Worksheets("運賃表").Cells(始発駅番号 + 2, 終着駅番号 + 2) '書き換え
検索結果.Range("指定席特急料金").Value = Worksheets("指定席特急料金表").Cells(始発駅番号 + 2, 終着駅番号 + 2) '書き換え
検索結果.Range("自由席特急料金").Value = Worksheets("自由席特急料金表").Cells(始発駅番号 + 2, 終着駅番号 + 2) '書き換え
検索結果.Range("のぞみ特急料金").Value = Worksheets("のぞみ特急料金表").Cells(始発駅番号 + 2, 終着駅番号 + 2) '書き換え
' 上り/下りのどちらかを調べる
If 始発駅番号 < 終着駅番号 Then
' 下り
時刻表名 = "時刻表下り"
列車総本数 = 下り列車本数
Else
' 上り
時刻表名 = "時刻表上り"
列車総本数 = 上り列車本数
始発駅番号 = 駅数 - 始発駅番号 - 1 '書き換え
終着駅番号 = 駅数 - 終着駅番号 - 1 '書き換え
End If
Set 時刻表 = Worksheets(時刻表名)
時刻表.Activate
' 検索条件をセットする
時刻表.Range(Cells(条件範囲先頭行, 1), Cells(条件範囲先頭行 + 6, 5)).Value = ""
時刻表.Range(Cells(抽出範囲先頭行 + 1, 1), Cells(抽出範囲先頭行 + 最大抽出数, 駅数 + 2)).Value = ""
時刻表.Range(Cells(1, 1), Cells(1, 駅数 + 2)).Copy
時刻表.Cells(抽出範囲先頭行, 1).Select
時刻表.Paste
時刻表.Cells(条件範囲先頭行, 1).Value = "列車種別"
時刻表.Cells(条件範囲先頭行, 2).Value = D_始発駅.List(D_始発駅.ListIndex)
時刻表.Cells(条件範囲先頭行, 3).Value = D_始発駅.List(D_始発駅.ListIndex)
時刻表.Cells(条件範囲先頭行, 4).Value = D_終着駅.List(D_終着駅.ListIndex)
時刻表.Cells(条件範囲先頭行, 5).Value = D_終着駅.List(D_終着駅.ListIndex)
条件行 = 条件範囲先頭行 + 1

' XlOnではなくTrue
If C_のぞみ.Value = True Then
検索条件セット 時刻表, 条件行, "のぞみ"
条件行 = 条件行 + 1
End If
If C_ひかり.Value = True Then
検索条件セット 時刻表, 条件行, "ひかり"
条件行 = 条件行 + 1
End If
If C_こだま.Value = True Then
検索条件セット 時刻表, 条件行, "こだま"
条件行 = 条件行 + 1
End If
' 2010/7/18 書き換え
If C_さくら.Value = True Then
検索条件セット 時刻表, 条件行, "さくら"
条件行 = 条件行 + 1
End If
' 2011/2/19 書き換え
If C_みずほ.Value = True Then
検索条件セット 時刻表, 条件行, "みずほ"
条件行 = 条件行 + 1
End If
' 2011/2/19 書き換え
If C_つばめ.Value = True Then
検索条件セット 時刻表, 条件行, "つばめ"
条件行 = 条件行 + 1
End If
条件行 = 条件行 - 1

' 列車を検索する
Set データ範囲 = 時刻表.Range(Cells(1, 1), Cells(列車総本数 + 1, 駅数 + 2))
Set 条件範囲 = 時刻表.Range(Cells(条件範囲先頭行, 1), Cells(条件行, 5))
Set 抽出範囲 = 時刻表.Range(Cells(抽出範囲先頭行, 1), _
Cells(抽出範囲先頭行 + 最大抽出数, 駅数 + 2))
データ範囲.AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=条件範囲, _
CopyToRange:=抽出範囲
' 検索された列車の本数を数える
該当列車本数 = Application.CountA(Range(Cells(抽出範囲先頭行 + 1, 1), _
Cells(抽出範囲先頭行 + 列車総本数, 1)))
' 「検索結果」ワークシートに該当列車本数をセットする
検索結果.Range("列車本数").Value = 該当列車本数
If 該当列車本数 = 0 Then
Beep
MsgBox "該当する列車がありません"
検索結果.Activate
Application.ScreenUpdating = True
Exit Sub
End If

' 検索結果を並べ替える
Set 並べ替え範囲 = 時刻表.Range(Cells(抽出範囲先頭行 + 1, 1), _
Cells(抽出範囲先頭行 + 該当列車本数, 駅数 + 2))
If O_表示順序始発.Value = True Then
Set 並べ替えキー = 時刻表.Cells(抽出範囲先頭行 + 1, 始発駅番号 + 3) '書き換え
Else
Set 並べ替えキー = 時刻表.Cells(抽出範囲先頭行 + 1, 終着駅番号 + 3) '書き換え
End If
並べ替え範囲.Sort Key1:=並べ替えキー, order1:=xlAscending, _
Header:=xlNo

' 結果を「検索結果」ワークシートにコピーする
時刻表.Range(Cells(抽出範囲先頭行 + 1, 1), _
Cells(抽出範囲先頭行 + 該当列車本数, 2)).Copy
検索結果.Activate
検索結果.Range("列車種別").Select
検索結果.Paste
時刻表.Activate
時刻表.Range(Cells(抽出範囲先頭行 + 1, 始発駅番号 + 3), _
Cells(抽出範囲先頭行 + 該当列車本数, 始発駅番号 + 3)).Copy '書き換え
検索結果.Activate
検索結果.Range("始発時刻").Select
検索結果.Paste
Selection.Interior.ColorIndex = 15
時刻表.Activate
時刻表.Range(Cells(抽出範囲先頭行 + 1, 終着駅番号 + 3), _
Cells(抽出範囲先頭行 + 該当列車本数, 終着駅番号 + 3)).Copy '書き換え
検索結果.Activate
検索結果.Range("終着時刻").Select
検索結果.Paste
Selection.Interior.ColorIndex = 15
' 検索結果に罫線を引く
Y = 検索結果.Range("列車種別").Row
X1 = 検索結果.Range("列車種別").Column
X2 = 検索結果.Range("終着時刻").Column
Range(Cells(Y, X1), Cells(Y + 該当列車本数 - 1, X2)).Borders(xlBottom).Weight = xlThin
Range(Cells(Y + 該当列車本数 - 1, X1), Cells(Y + 該当列車本数 - 1, X2)).Borders(xlBottom).Weight = xlMedium
X1 = 検索結果.Range("始発時刻").Column
Range(Cells(Y, X1), Cells(Y + 該当列車本数 - 1, X1)).Borders(xlLeft).Weight = xlThin
Range(Cells(Y, X2), Cells(Y + 該当列車本数 - 1, X2)).Borders(xlLeft).Weight = xlThin
' 列車種別毎に色を塗り分ける
X1 = 検索結果.Range("列車種別").Column
For I = 1 To 該当列車本数
列車名 = 検索結果.Cells(Y, X1).Value
If 列車名 = "のぞみ" Then
Range(Cells(Y, X1), Cells(Y, X1 + 1)).Interior.ColorIndex = 6
Range(Cells(Y, X1), Cells(Y, X1 + 1)).Font.ColorIndex = 1

' 2011/2/19 書き換え
ElseIf 列車名 = "みずほ" Then
Range(Cells(Y, X1), Cells(Y, X1 + 1)).Interior.ColorIndex = 6
Range(Cells(Y, X1), Cells(Y, X1 + 1)).Font.ColorIndex = 1

ElseIf 列車名 = "ひかり" Then
Range(Cells(Y, X1), Cells(Y, X1 + 1)).Interior.ColorIndex = 3
Range(Cells(Y, X1), Cells(Y, X1 + 1)).Font.ColorIndex = 2

' 2010/7/18 書き換え
ElseIf 列車名 = "さくら" Then
Range(Cells(Y, X1), Cells(Y, X1 + 1)).Interior.ColorIndex = 3
Range(Cells(Y, X1), Cells(Y, X1 + 1)).Font.ColorIndex = 2

Else
Range(Cells(Y, X1), Cells(Y, X1 + 1)).Interior.ColorIndex = 5
Range(Cells(Y, X1), Cells(Y, X1 + 1)).Font.ColorIndex = 2
End If

Y = Y + 1
Next
検索結果.Cells(1, 1).Select

' 画面の描画を元に戻す
Application.ScreenUpdating = True

OKクリック

End Sub

' 検索条件をセットする
Sub 検索条件セット(時刻表 As Worksheet, 条件行, 列車種別)
時刻表.Cells(条件行, 1) = 列車種別
If E_始発時刻自.Text <> "" Then
時刻表.Cells(条件行, 2).Value = ">=" + E_始発時刻自.Text
時刻表.Cells(条件行, 3).Value = "<=" + E_始発時刻至.Text
Else
時刻表.Cells(条件行, 2).Value = "<>"
時刻表.Cells(条件行, 3).Value = "<>"
End If
If E_終着時刻自.Text <> "" Then
時刻表.Cells(条件行, 4).Value = ">=" + E_終着時刻自.Text
時刻表.Cells(条件行, 5).Value = "<=" + E_終着時刻至.Text
Else
時刻表.Cells(条件行, 4).Value = "<>"
時刻表.Cells(条件行, 5).Value = "<>"
End If

End Sub

' 「検索条件」ダイアログボックスの「OK」ボタンが押されたときの処理
Sub OKクリック()
' 始発駅と終着駅が同じでないかどうかを調べる
If D_始発駅.ListIndex = D_終着駅.ListIndex Then
Beep
MsgBox "始発駅と終着駅が同じです"

検索結果クリア

Exit Sub
End If
' 始発時刻で「から」「まで」のいずれかしか指定されていないときは
' その時刻ちょうどに出る列車のみを検索する
If E_始発時刻自.Text <> "" And E_始発時刻至.Text = "" Then
E_始発時刻至.Text = E_始発時刻自.Text
End If
If E_始発時刻至.Text <> "" And E_始発時刻自.Text = "" Then
E_始発時刻自.Text = E_始発時刻至.Text
End If
' 終着時刻で「から」「まで」のいずれかしか指定されていないときは
' その時刻ちょうどに到着する列車のみを検索する
If E_終着時刻自.Text <> "" And E_終着時刻至.Text = "" Then
E_終着時刻至.Text = E_終着時刻自.Text
End If
If E_終着時刻至.Text <> "" And E_終着時刻自.Text = "" Then
E_終着時刻自.Text = E_終着時刻至.Text
End If

' 列車種別がどれか1つは選ばれているかどうかを調べる
' 2010/7/18
' xlOffではなくFalse
If C_のぞみ.Value = False And C_ひかり.Value = False And C_こだま.Value = False And _
C_さくら.Value = False And C_みずほ.Value = False And C_つばめ.Value = False Then
Beep
MsgBox "列車種別を最低1つは選んでください"

検索結果クリア

Exit Sub
End If
' エラーが起こっていなければダイアログボックスを閉じる
'DialogSheets("検索条件").Hide
Unload Me

End Sub

Sub 検索結果クリア()
Dim X1, X2, Y

' 「検索結果」ワークシートをクリアする
Set 検索結果 = Worksheets("検索結果")
検索結果.Activate
Y = 検索結果.Range("列車種別").Row
X1 = 検索結果.Range("列車種別").Column
X2 = 検索結果.Range("終着時刻").Column
検索結果.Range(Cells(Y, X1), Cells(Y + 最大抽出数, X2)).Clear
検索結果.Range(Cells(Y, X1), Cells(Y + 最大抽出数, X2)).Interior.ColorIndex = 15

End Sub

Private Sub CommandButton2_Click()
Unload MyForm1
End Sub
 
◆2011/4/23
 震災以来、Excelプログラムとは向き合っていません。今朝、昨年7/3に業務用に書いたコードを開いてみました。参考書には自分のファイルに対しての検索の書き方が載っていましたので、あの日は何だか今日は書けそうな気がすると部屋に籠もりました。自分のファイルから他のファイルを開き検索をかけます。

Sub エラーレコード抽出()
'
' エラーレコード抽出 Macro
' マクロ記録日 : 2010/6/14 ユーザー名 : ettomio 2010/7/3
'
  Sheets("エラーレコード抽出").Select
  Application.Run "配布用確定一覧N.XLS!エラーレコード削除"
  Sheets("併合読込").Select
  Columns("A:Q").Select
  Selection.AutoFilter
  Selection.AutoFilter Field:=17, Criteria1:="#N/A"
  Selection.Copy
  Sheets("エラーレコード抽出").Select
  Range("A1").Select
  ActiveSheet.Paste
  Application.CutCopyMode = False
  Range("R5").Select
  Sheets("併合読込").Select
  Selection.AutoFilter
  Range("R5").Select
  Sheets("エラーレコード抽出").Select

  Application.Run "配布用確定一覧N.XLS!値のあるセルに色を付ける"

  MsgBox "V列の黄色部分の品名を選択し、「検索」ボタンを押して下さい。", vbOKOnly

End Sub

Sub エラーレコード削除()
'
' エラーレコード削除 Macro
' マクロ記録日 : 2010/6/13 ユーザー名 : ettomio
'
  Sheets("エラーレコード抽出").Select
  Application.Run "配布用確定一覧N.XLS!セルの色を消す"

  Columns("A:Q").Select
  Selection.ClearContents
  Range("S3").Select
End Sub

Sub セルの色を消す()
' 20107/3 ettomio
' 2を選択すると罫線まで消えてしまう。
' 次にマクロを実行したとき前回の色が残ってしまうのを回避。

  For y = 2 To 30
  Cells(y, 22).Interior.ColorIndex = 0
  Next
End Sub

Sub 値のあるセルに色を付ける()
' 2010/7/3 ettomio
' セルの色は黄色
' Excel VBAプログラミング 280ページ参照。

  For y = 2 To 30
  If Cells(y, 22).Value <> "" Then
  Cells(y, 22).Interior.ColorIndex = 6
End If
Next
End Sub

Sub 検索を行う()
' 2010/7/3 ettomio
'「エラーレコード抽出」シートのV列のあるセルをクリックして
' マクロを実行すると、その前のU列で「確定一覧」のシート名を拾い
' 変数 sh に代入し、そのシートを開いて検索する。
' Excel VBAプログラミング288ページ参照。
' 但し、他のBookを開きシート名を代入してシートを開いての検索だから全くの別物。


Dim key As String
Dim 検索セル As Range
Dim sh As String

key = ActiveCell.Value
sh = ActiveCell.Offset(0, -1).Value


  Application.Run "配布用確定一覧N.XLS!確定一覧を開く"
  Windows("確定一覧.XLS").Activate
  ActiveWindow.ScrollWorkbookTabs Sheets:=10
  Worksheets(sh).Select

  Set 検索セル = Cells.Find(What:=key & "*", _
  LookIn:=xlValues, LookAt:=xlWhole, _
  SearchOrder:=xlColumns, MatchByte:=True)
If Not 検索セル Is Nothing Then
  検索セル.Activate
End If

End Sub
◆2011/4/21
 この動画は初めて見ます。なんと赤の広場じゃないですか。そして当時のプーチン大統領の姿まで見えます。
Paul McCartney - Let It Be [Red Square, Moscow '2003]
Paul McCartney in Red Square : Yesterday
Paul McCartney - Hey Jude (Live)
◆2011/4/20
 田んぼ作業以外、引きこもりのような土日を過ごしていましたが、先日の土日は5週間ぶりに新幹線撮影に出向きました。
   
◆2011/4/19
Paul McCartney & all artists - Let It Be (Nobel Peace Prize)
LET IT BE - Paul McCartney & Billy Joel
Paul McCartney - Elton John - Sting @ Hey Jude Live
◆2011/4/19
Billy Joel "Piano Man"
Billy Joel: Piano Man
billy joel and elton john-the piano man
◆2011/4/13
 IE9、早速不具合を見つけましたが、ま、正規版のリリースではないので、今のところは我慢して使ってみます。
◆2011/4/13
 帰宅して、インターネットブラウザを見ると、どうも勝手が違うな・・ あっ、そういえば昨夜マイクロソフトのIE9 製品候補版にアップグレードしたんだった。
 IE9βの時は、インストールして、使い物にならないと2時間後に元に戻した記憶があります。今回のIE9 製品候補版は使えそうな気がします。あの震災が無ければ、製品版がリリースされていたかもしれません。
 ただ、IE9はXPでは使えないようです。VistaとWin7だけのようですが、IE8で別に問題もないと思います。
◆2011/4/13
 原発についてはもう余り書かないと言いました。とうとうレベル7まで引き上げられたようですが。
 この処、世間、巷では俄評論家が多いですね。あれだけTV,新聞,週刊誌,ネットと大騒ぎすれば、それも直接の震災地のニュースよりも原発問題の方が多い。原子力の仕組みをご存じなくてもあれだけ騒げば受け売りで喋れますね。
 さてもう買わなくなった週刊誌ですが、表紙だけ見ると、20年後が危ないと書かれています。枝野みたいですね。直ちに健康上は問題ない。週刊誌さん、本当に危機的状況だったら、東京の出版社を逃げて下さい。
 20年後の影響たってね。現在一番の死因は癌ですよ。20年後に癌患者が増えたからって、因果関係が立証されますか。
◆2011/4/12
お便り有り難う御座います。お久しぶりです。
私は、もう余り原発問題に関して考えるの止めました。
以前、震災の後は週刊誌も数冊買っては隅々まで読んでいましたが、
週刊誌は元々購読数を増やすために悲観的に書くモノ。
実は私の三男が川崎に住んでいまして、官邸、東電、保安院の奴らがTVに出なくなったら東京を捨てて逃げて来いと思っています。
元に戻って、週刊誌、そんなに危なければ東京の出版社を逃げ出したらと申し上げたくなります。以前も書いていますね。
今日帰宅したら、NHKで菅直人が記者会見していました。
ま、いいこと言ってますね。アンタはそれを何故震災から1週間後に発表出来なかったんだ !
この危機に乗じて延命を画策するアンタがこの国の復興、原発問題の収束を阻害している第一の危険分子。亡国の輩。最早国際社会では、呆れられているというより、あのトップでは日本はどん底まで落ち込んでしまうと憂虞される有様。この国の将来のため早くトップから降りて下さい。
尚、原発についていはもう余り書きたくありませんが、私の処から一番近くの原発は海を隔てて、直ぐ近くにある愛媛県の伊方原発です。ここには日本で2番目のプルサーマル原発があります。3番目が大事故を起こしている福島の3号炉です。
◆2011/4/9
David Bowie Rock'n roll Suicide - Live in Japan
David Bowie ft. Mike Garson - My Death (Live)
◆2011/4/4
 それでも桜は咲く
   
◆2011/4/2
 それでも桜は咲く
   
◆2011/4/2
早朝、ある新幹線投稿サイトに以下の文を載せました。

小心者の私は夜アルコールが入ると、
日記や此処に憤懣を書き込み
翌朝になると自己憐憫という有様です。
私の行為こそ傲岸不遜、不安を煽る風評の発信元。
申し訳ございません。
自重致します。

先頭に戻る    過去の日記