[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『過去のエクセルファイルのマクロコードが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.