[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『過去のエクセルファイルのマクロコードがVBAで表示されない』(める)
お世話になっております
10年以上前に作成されメンテナンスされていないエクセルファイルがあります
表にデータを入力してヒストグラムを作成するマクロが組んであるようですが
2016の仕様では意図した通りに表示できないみたいです
マクロの編集(Alt+F8)ではマクロはブックの中に存在するようですが
VBAで編集しようとするとコードの記述がない状態に遭遇しました
2003年、あるいはそれ以前のエクセルファイルのマクロ用コードは
何か特殊な書き方とかされていたのでしょうか?
基本的にエクセルファイルは下位互換があるはずなので勝手に消えてしまうってことはないような気がするんですが・・・
現在のVer.で新しく同じ動作をするマクロ組んじゃった方が早いでしょうかね?
< 使用 Excel:Office365、使用 OS:Windows10 >
VBAプロジェクトはパスワードを付けて中身を見せなくする事ができます。ダブルクリックでパスワードを聞いてくるようならば、コードは隠されています。 元の作成者からパスワードを聞き出してください。(ハッキングする方法はありますが、やって良いかの判断は必要)
パスワードが判れば、「VBAProject」を右クリックし、「プロパティ」−「保護」でパスワードを外すこともできるようになります。
パスワードがかかっていないならば、マクロはブックの中ではなく、「個人用マクロブック」、つまり別ブックの中に書いたとか?(マクロの記録機能を使った場合、どっちに保存するか選択できます)
(???) 2019/10/17(木) 14:00
2000年より前に作られたものらしいので、ヒストグラムを生成するマクロではなく
普通に2016の機能にあるグラフツールから自動的にヒストグラムを作成するように
作り直した方が早そうですね
Sub 工程能力()
選定Cpグラフ
初期設定
工程能力メイン
列配置
If 実行 <> "異常" Then 罫線
End Sub
Sub 工程能力時系列()
選定Cp管理図グラフ
初期設定
工程能力メイン
時系列グラフ追加
列配置
罫線
End Sub
Sub 時系列グラフ()
選定管理図グラフ
初期設定
時系列グラフ単独
列配置
罫線
End Sub
Sub 列配置()
Shtグラフ.Columns(列No).HorizontalAlignment = xlCenter
Shtグラフ.Columns(列平均).HorizontalAlignment = xlCenter
Shtグラフ.Columns(列σ).HorizontalAlignment = xlCenter
Shtグラフ.Columns(列Cp).HorizontalAlignment = xlCenter
Shtグラフ.Columns(列評価).HorizontalAlignment = xlCenter
End Sub
Sub 罫線()
With Shtグラフ.Range(Shtグラフ.Cells(G記入開始行, 列No), _
Shtグラフ.Cells(行位置, 列備考))
.Borders(xlLeft).Weight = xlThin
.Borders(xlRight).Weight = xlThin
.Borders(xlTop).Weight = xlThin
.Borders(xlBottom).Weight = xlThin
.BorderAround Weight:=xlMedium
End With
If 横個数 > 1 Then
With Shtグラフ.Range(Shtグラフ.Cells(G記入開始行, 列No + (横個数 - 1) * 列備考), _
Shtグラフ.Cells(行位置, 列備考 + (横個数 - 1) * 列備考))
.Borders(xlLeft).Weight = xlThin
.Borders(xlRight).Weight = xlThin
.Borders(xlTop).Weight = xlThin
.Borders(xlBottom).Weight = xlThin
.BorderAround Weight:=xlMedium
End With
End If
End Sub
(める) 2019/10/17(木) 14:18
ならば、例えば「選定Cpグラフ」の部分にカーソルを合わせておいて、Shift+F2キーを押してみてください。 呼び出しているプロシジャの実体に飛ぶことができるので、同じプロジェクト内にコードが書かれていれば表示されるはずです。(余談ながら、飛び先でCtrl+Shift+F2を押すと、元の行に戻る)
シートモジュールと標準モジュールに、バラバラにプロシジャを置いているだけでは? 共通部分は標準モジュールで、シート固有はシートモジュールに書く、というのは、みんなやっている事です。
(???) 2019/10/17(木) 14:25
Option Explicit
'-------名前の定義「データ表」の縦位置---
Public Const CdNo = 5, Cd品番 = 6, Cd品名 = 7, Cd特性 = 8, Cd規格 = 9
Public Const Cd規格上限 = 10, Cd規格下限 = 11, C実行 = 12
Public Const Cdデータ開始 = 14
'-------グラフ
Public Const G記入開始行 = 5, G1No = 1, G1特性 = 2, G1グラフCp = 3, G1平均 = 4, G1σ = 5, G1Cp = 6, _
G1評価 = 7, G1備考 = 8
Public Const G2No = 1, G2特性 = 2, G2グラフ管理図 = 3, G2平均 = 4, G2σ = 5, G2Cp = 6, _
G2評価 = 7, G2備考 = 8
Public Const G3No = 1, G3特性 = 2, G3グラフ管理図 = 3, G3グラフCp = 4, G3平均 = 5, G3σ = 6, G3Cp = 7, _
G3評価 = 8, G3備考 = 9
'-------名前の定義「度数データ」の縦位置---
Public Const C度数品番 = 3, C度数品名 = 4, C度数特性 = 5, C度数規格 = 6, C度数上限 = 7, C度数下限 = 8, _
C度数N数 = 9, C度数平均値 = 10, C度数Cp = 11, C度数Cpk = 12, _
C度数標準偏差 = 13, C度数最大値 = 14, C度数最小値 = 15, C度数判定 = 16, C度数級幅開始 = 18
'--------------------------------------
Public Const C_MAX_級数 = 100 '級数の配列最大値
Public Const C_級文字数 = 3 '級の文字数が3以下の場合,○〜○表示
Public Const C_級文字数_多 = 5 '級の文字数が3以下の場合,○〜表示,6以上は中央値表示
Public Const CC行開始位置 = 5 '文字の縦側 貼り付け位置
'-------用紙の設定---------------
Public 横個数 As Integer 'グラグの横方向の貼り付け個数
Public 列位置(4) As Integer '文字の横側 貼り付け位置
'---------------------------------------
Public Shtデータ As Object
Public Sht度数表 As Object
Public Shtグラフ As Object
Public Sht基準グラフ As Object
Public グラフShtNo As Integer 'Cpグラフ:1 管理図グラフ:2 Cp管理図グラフ:3
Public Gf修正 As Integer 'グラフを貼り付けでなく、修正する場合「true
Public PltエリアL As Single 'グラフの左位置
Public PltエリアW As Single 'グラフの幅
Public Plt_Y軸 As Single 'グラフのY軸位置
Public 矢平均位置Lft As Single 'グラフの平均値の矢印左位置
Public 矢平均位置Wdh As Single 'グラフの平均値の矢印右位置
Public Txt平均値Wdh As Single 'グラフの平均値の幅」
Public 済の有無 As Integer 'データ表に済がある時は修正モードにする
'-------変数名---------------
Public 測定値() As Double '測定データ
Public N数 As Integer '測定データ数
Public 最大値 '測定データ最大値
Public 最小値 '測定データ最小値
Public 平均値 '測定データ最小値
Public 標準偏差 '標準偏差
Public Cp '工程能力指数
Public Cpk '工程能力指数
Public 判定 As String
Public 上限規格 '規格の上限値
Public 下限規格 '規格の下限値
Public 規格種別 As String '両:両側規格、上:上限規格、下:下限規格
Public 級数 As Integer '度数表の級数
Public 特性数 As Integer ' データの特性数
Public 特性No As Integer '現在処理中の特性項目
Public 特性列No As Integer '現在処理中の特性列No
Public 特性列No2 As Integer
Public 測定桁 As Integer '測定単位の桁数(マイナスは小数点)
Public 実行 As String '実行済みのデータか
'Public is級幅Dlg As Boolean
Public 列No As Integer
Public 列特性 As Integer
Public 列グラフ管理図 As Integer
Public 列グラフCp As Integer
Public 列平均 As Integer
Public 列σ As Integer
Public 列Cp As Integer
Public 列評価 As Integer
Public 列備考 As Integer
Sub 選定Cpグラフ()
グラフShtNo = 1
End Sub
Sub 選定管理図グラフ()
グラフShtNo = 2
End Sub
Sub 選定Cp管理図グラフ()
グラフShtNo = 3
End Sub
Sub 初期設定()
Set Shtデータ = Sheets("データ")
Set Sht度数表 = Sheets("度数")
Set Sht基準グラフ = Sheets("基準グラフ")
Select Case グラフShtNo
Case 1
Set Shtグラフ = Sheets("Cpグラフ")
列No = G1No
列特性 = G1特性
列グラフ管理図 = 0
列グラフCp = G1グラフCp
列平均 = G1平均
列σ = G1σ
列Cp = G1Cp
列評価 = G1評価
列備考 = G1備考
Case 2
Set Shtグラフ = Sheets("時系列グラフ")
列No = G2No
列特性 = G2特性
列グラフ管理図 = G2グラフ管理図
列グラフCp = 0
列平均 = G2平均
列σ = G2σ
列Cp = G2Cp
列評価 = G2評価
列備考 = G2備考
Case Else
Set Shtグラフ = Sheets("Cp時系列グラフ")
列No = G3No
列特性 = G3特性
列グラフ管理図 = G3グラフ管理図
列グラフCp = G3グラフCp
列平均 = G3平均
列σ = G3σ
列Cp = G3Cp
列評価 = G3評価
列備考 = G3備考
End Select
End Sub
Sub クリアデータ()
Dim 最終行 As Integer
Dim 最終列 As Integer
Set Shtデータ = Sheets("データ")
最終行 = Shtデータ.UsedRange.Rows.Count
最終列 = Shtデータ.UsedRange.Columns.Count
Shtデータ.Range(Shtデータ.Cells(Cd品番, 3), Shtデータ.Cells(C実行, 最終列)).ClearContents
Shtデータ.Range(Shtデータ.Cells(Cdデータ開始, 3), Shtデータ.Cells(最終行, 最終列)).ClearContents
End Sub
'========Sheetグラフの記入箇所をクリア
Sub クリアグラフ()
Dim 最終行 As Integer
Shtグラフ.Select
ActiveSheet.DrawingObjects.Delete 'グラフをクリア
最終行 = Shtグラフ.UsedRange.Rows.Count
Range(Shtグラフ.Rows(G記入開始行), Shtグラフ.Rows(最終行)).ClearContents
End Sub
'========Sheetグラフの記入箇所をクリア
Sub クリア度数()
Dim 最終行 As Integer
最終行 = Sht度数表.UsedRange.Rows.Count
Sht度数表.Range(Sht度数表.Rows(C度数級幅開始), Sht度数表.Rows(最終行)).ClearContents
End Sub
'======用紙選択
Sub 用紙()
横個数 = 1
If Shtデータ.OptionButtons("OptA4").Value = xlOn Then '用紙A4
Shtグラフ.Range(Shtグラフ.Columns(列No + 列備考), Shtグラフ.Columns(列備考 * 2)).ClearContents
On Error Resume Next
Shtグラフ.PageSetup.PaperSize = xlPaperA4
Else '用紙A3
Shtグラフ.Range(Shtグラフ.Columns(列No), Shtグラフ.Columns(列備考)).Select
Selection.Copy
Shtグラフ.Cells(1, 列No + 列備考).Select
Shtグラフ.Paste
Shtグラフ.Cells(1, 1).Select
Shtグラフ.Cells(1, 列No + 1).Value = ""
横個数 = 2
On Error Resume Next
Shtグラフ.PageSetup.PaperSize = xlPaperA3
End If
On Error GoTo 0
End Sub
モジュールの中にはMdl0初期設定、Mdl1メイン、と訳8個のモジュールがありました
使ったことのない記述ばかりで目をぱちくりしております・・・
(める) 2019/10/17(木) 14:46
未知の領域でビビッておりますがよろしくご教授願います
(める) 2019/10/17(木) 14:57
コードが長いので追いかける気はしませんが、要所にブレークポイントを設定しておいて実行してみるとか、ステップ実行してみて、コードを理解するしかないでしょうね。
ただ、グラフの種類を変えてはいないようなので、貼ってあるグラフを右クリックし、「グラフの種類を変更」してみてはどうでしょうか。
(???) 2019/10/17(木) 18:09
どうやら定年退社なさったこのマクロの作成者はとても
専門的でプロフェッショナルな方だったようです・・・
画像編集するソフトをプログラミングできるほどの腕だったらしい
と言われて理解が追いつくかどうか怖いです、ですが頑張ってみます
このマクロがきちんと作動してくれれば業務の効率がかなり上がりますのでやる価値はあるようです
参考までに画像をアップしてみましたのでもし気が付いたことがありましたら教えて下さい。
(める) 2019/10/18(金) 08:40
折れ線グラフになるのは工程能力ではなく時系列に対するものだったので
ヒストグラムが折れ線になっているわけではなさそうです
ということは元となるグラフに問題があるのと
私のヒストグラムに対する理解度が足りない気がしてきてきました
Excel2016以前のExcelではどうやってヒストグラムを作っていたのか
勉強してこのマクロを理解していきたいと思います
(正直な所マクロ作る人間はこのファイルの使い方みたいな解説書なりreadmeなり
残すべきなんじゃないかなぁと思いました)
(める) 2019/10/18(金) 12:48
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.