[[20191017132931]] 『過去のエクセルファイルのマクロコードがVBAで表氏x(める) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『過去のエクセルファイルのマクロコードがVBAで表示されない』(める)

お世話になっております

10年以上前に作成されメンテナンスされていないエクセルファイルがあります
表にデータを入力してヒストグラムを作成するマクロが組んであるようですが

2016の仕様では意図した通りに表示できないみたいです

マクロの編集(Alt+F8)ではマクロはブックの中に存在するようですが
VBAで編集しようとするとコードの記述がない状態に遭遇しました

2003年、あるいはそれ以前のエクセルファイルのマクロ用コードは
何か特殊な書き方とかされていたのでしょうか?

基本的にエクセルファイルは下位互換があるはずなので勝手に消えてしまうってことはないような気がするんですが・・・

現在のVer.で新しく同じ動作をするマクロ組んじゃった方が早いでしょうかね?

< 使用 Excel:Office365、使用 OS:Windows10 >


マクロ編集画面左側のツリーに「VBAProject」とあるかと思いますが、これをダブルクリックするとどうなるでしょう?

VBAプロジェクトはパスワードを付けて中身を見せなくする事ができます。ダブルクリックでパスワードを聞いてくるようならば、コードは隠されています。 元の作成者からパスワードを聞き出してください。(ハッキングする方法はありますが、やって良いかの判断は必要)

パスワードが判れば、「VBAProject」を右クリックし、「プロパティ」−「保護」でパスワードを外すこともできるようになります。

パスワードがかかっていないならば、マクロはブックの中ではなく、「個人用マクロブック」、つまり別ブックの中に書いたとか?(マクロの記録機能を使った場合、どっちに保存するか選択できます)
(???) 2019/10/17(木) 14:00


数値データを入力していない原紙扱いのファイルを開きVBAを呼び出すと
こんなコードしかなかったのでこれは個人用マクロブックから呼び出していたか
コードが消失したかのどちらかでしょうかね(古いコードの記述が消えるってあり得るのかな?w)

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


グラフの種類の変更は試したのですが
ヒストグラムを選ぼうとすると複合グラフにできないグラフの種類があります
と表示されてしまいます

どうやら定年退社なさったこのマクロの作成者はとても
専門的でプロフェッショナルな方だったようです・・・

画像編集するソフトをプログラミングできるほどの腕だったらしい
と言われて理解が追いつくかどうか怖いです、ですが頑張ってみます

このマクロがきちんと作動してくれれば業務の効率がかなり上がりますのでやる価値はあるようです
参考までに画像をアップしてみましたのでもし気が付いたことがありましたら教えて下さい。

https://filestore.community.support.microsoft.com/api/images/ddbf8423-5b16-425e-b0e4-998da2dee6b6?upload=true

(める) 2019/10/18(金) 08:40


仮データを入れてVBAを見ながら少しづつ進めた所、基本的には問題となる動きはなさそうでした

折れ線グラフになるのは工程能力ではなく時系列に対するものだったので
ヒストグラムが折れ線になっているわけではなさそうです

ということは元となるグラフに問題があるのと
私のヒストグラムに対する理解度が足りない気がしてきてきました

Excel2016以前のExcelではどうやってヒストグラムを作っていたのか
勉強してこのマクロを理解していきたいと思います

(正直な所マクロ作る人間はこのファイルの使い方みたいな解説書なりreadmeなり
 残すべきなんじゃないかなぁと思いました)
(める) 2019/10/18(金) 12:48


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.