Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1544 / 13645 ツリー ←次へ | 前へ→

【73649】マクロを削除するマクロ ブーチー 13/1/29(火) 16:24 質問[未読]
【73654】Re:マクロを削除するマクロ UO3 13/1/29(火) 20:49 発言[未読]
【73657】Re:マクロを削除するマクロ ブーチー 13/1/31(木) 8:15 お礼[未読]
【73659】Re:マクロを削除するマクロ UO3 13/1/31(木) 9:31 発言[未読]
【73660】Re:マクロを削除するマクロ ブーチー 13/1/31(木) 9:42 お礼[未読]
【73661】Re:マクロを削除するマクロ UO3 13/1/31(木) 11:16 発言[未読]
【73662】Re:マクロを削除するマクロ ブーチー 13/1/31(木) 11:22 発言[未読]
【73663】Re:マクロを削除するマクロ UO3 13/1/31(木) 11:32 発言[未読]
【73664】Re:マクロを削除するマクロ ブーチー 13/1/31(木) 12:08 発言[未読]
【73665】Re:マクロを削除するマクロ UO3 13/1/31(木) 19:02 発言[未読]
【73672】Re:マクロを削除するマクロ ブーチー 13/2/1(金) 9:34 発言[未読]
【73673】Re:マクロを削除するマクロ UO3 13/2/1(金) 10:07 発言[未読]
【73674】Re:マクロを削除するマクロ UO3 13/2/1(金) 10:41 発言[未読]
【73675】Re:マクロを削除するマクロ ブーチー 13/2/1(金) 10:58 お礼[未読]
【73676】Re:マクロを削除するマクロ UO3 13/2/1(金) 11:31 発言[未読]
【73655】Re:マクロを削除するマクロ ichinose 13/1/29(火) 21:08 発言[未読]
【73658】Re:マクロを削除するマクロ ブーチー 13/1/31(木) 8:23 お礼[未読]
【73682】Re:マクロを削除するマクロ ichinose 13/2/2(土) 9:24 発言[未読]
【73695】Re:マクロを削除するマクロ ブーチー 13/2/3(日) 8:14 お礼[未読]

【73649】マクロを削除するマクロ
質問  ブーチー  - 13/1/29(火) 16:24 -

引用なし
パスワード
   ファイルにSheetが4つあります。
マクロに関しては、標準モジュールはないのですが、各シートに一部のシートに(例えば、4枚シートがあったら2枚だけに)、例えば次のようなコードが書かれています。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub


ファイルを開くたびに、マクロを有効にしますかと聞かれるので、マクロのコードを消してしまいたいのです。

マクロを消したいファイルとは別のファイルにマクロを書いて実行し、対象となるファイルのマクロを消したいのですが、どうすれば良いのか教えてください。
よろしくお願いいたします。

【73654】Re:マクロを削除するマクロ
発言  UO3  - 13/1/29(火) 20:49 -

引用なし
パスワード
   ▼ブーチー さん:

正攻法(?)としては、いつもメッセージが出て困るブックのマクロを手作業で消せばよろしいかと。

本件、回答をしてくださる回答者もいらっしゃるかもしれませんが
私自身のポリシーとしては、マクロウィルスともいえる、こういった手法を
公の掲示板でアップするのは控えています。

といって、たいしたものではありません。
【VBA VBIDE】あたりで検索して参照すれば、わりあいと簡単なものですので
自助努力で対処されるのがよろしいのかなと。

【73655】Re:マクロを削除するマクロ
発言  ichinose  - 13/1/29(火) 21:08 -

引用なし
パスワード
   こんばんは。

>ファイルにSheetが4つあります。
>マクロに関しては、標準モジュールはないのですが、各シートに一部のシートに(例えば、4枚シートがあったら2枚だけに)、例えば次のようなコードが書かれています。
>
>Private Sub Worksheet_SelectionChange(ByVal Target As Range)
>
>End Sub
上記のイベントプロシジャーは、Thisworkbookの
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

End Sub

↑ここに移動し、記述することが可能です。

上記のイベントを良く調べてください。

このようにしておけば、後は、シートコピーで新しいブックを作成することが出来ます。
シートにVBAがないのでコピー先のブックには、VBAは含まれません。
このような手順で試してみては いかがですか?


>
>ファイルを開くたびに、マクロを有効にしますかと聞かれるので、マクロのコードを消してしまいたいのです。
>
>マクロを消したいファイルとは別のファイルにマクロを書いて実行し、対象となるファイルのマクロを消したいのですが、どうすれば良いのか教えてください。
>よろしくお願いいたします。

【73657】Re:マクロを削除するマクロ
お礼  ブーチー  - 13/1/31(木) 8:15 -

引用なし
パスワード
   ▼UO3 さん レスありがとうございます。

>私自身のポリシーとしては、マクロウィルスともいえる、こういった手法を
私の質問が、まさかウイルスと関連するとは夢にも思っていませんでした。


>【VBA VBIDE】あたりで検索して参照すれば、わりあいと簡単なものですので
>自助努力で対処されるのがよろしいのかなと。

【VBA VBIDE】で確認してみましたが、私のやりたいことが分かる記事を見つけることは出来ませんでした。

【73658】Re:マクロを削除するマクロ
お礼  ブーチー  - 13/1/31(木) 8:23 -

引用なし
パスワード
   ▼ichinose さん 回答ありがとうございます。

>このようにしておけば、後は、シートコピーで新しいブックを作成することが出来ます。
>シートにVBAがないのでコピー先のブックには、VBAは含まれません。
>このような手順で試してみては いかがですか?

シートコピーとは”シートの移動またはコピー”という機能のコピーを指しているのでしょうか?
試してみましたが、新しいBOOKにコピーしても、上記のマクロのコードも残ったままで消えませんでした。

言われたことをヒントにして、単純に考えると、次のようにすれば良いと思いますが、自分ではコードが書けません。
お分かりでしたら、教えて頂けたらと思います。

1.新規にBOOKを作成する。
2.マクロがあるBOOKの各シートをコピーし、新規BOOKの各シートに貼り付ける。
3.マクロがあるBOOKは削除し、新規のBOOKにマクロがあったBOOKと同じ名前を付けて保存する。

【73659】Re:マクロを削除するマクロ
発言  UO3  - 13/1/31(木) 9:31 -

引用なし
パスワード
   ▼ブーチー さん:

おはようございます

もしかして質問というか、おやりになりたいことは

・エクセルブックがある
・このブックには標準モジュールはないけど、シートモジュールにイベントルーティンコードがかかれている
・これらマクロは。もはや不要。
・だけどブックを開くたびに、マクロ有効化に関するメッセージがでる。
・マクロを消してこのメッセージがでないようにしたい。

こういうことですか?
【別マクロを作って、これらシートモジュールのマクロを消したい】という記載があったので
意図につぃて、深く読みすぎましたかね?

もし、上記のようなことであれば、私が最初のレスで申し上げた【正攻法】。
つまり、コードが書かれているシートモジュールを開いて、
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 等、書かれているコードを
全てマウスで選択して、Deteteキー。これでマクロがなくなりますのでブックを保存。

こうすれば、次回からは、ただのエクセルブックですからメッセージはでませんが?

【73660】Re:マクロを削除するマクロ
お礼  ブーチー  - 13/1/31(木) 9:42 -

引用なし
パスワード
   ▼UO3 さん 回答ありがとうございます。

>もしかして質問というか、おやりになりたいことは
>
>・エクセルブックがある
>・このブックには標準モジュールはないけど、シートモジュールにイベントルーティンコードがかかれている
>・これらマクロは。もはや不要。
>・だけどブックを開くたびに、マクロ有効化に関するメッセージがでる。
>・マクロを消してこのメッセージがでないようにしたい。
>
>こういうことですか?

そうです。こういうことです。


>もし、上記のようなことであれば、私が最初のレスで申し上げた【正攻法】。

BOOKおよびBOOK内にシートがたくさんあるので、手動ではなく、マクロで処理したいと思って質問しています。

マクロを削除することが大変なことなのであれば、次のように新たなBOOKを作るということで構わないので、可能であればお教えください。

1.新規にBOOKを作成する。
2.マクロがあるBOOKの各シートをコピーし、新規BOOKの各シートに貼り付ける。
3.マクロがあるBOOKは削除し、新規のBOOKにマクロがあったBOOKと同じ名前を付けて保存する。

【73661】Re:マクロを削除するマクロ
発言  UO3  - 13/1/31(木) 11:16 -

引用なし
パスワード
   ▼ブーチー さん:

シート上に図形なんかはありますか?

【73662】Re:マクロを削除するマクロ
発言  ブーチー  - 13/1/31(木) 11:22 -

引用なし
パスワード
   ▼UO3 さん:

>シート上に図形なんかはありますか?

テキストボックスは有りますが、それ以外はありません。

ちなみに手動で全てのセルを選択しコピペすると、テキストボックスもサイズなど変わらずに貼ることができました。

【73663】Re:マクロを削除するマクロ
発言  UO3  - 13/1/31(木) 11:32 -

引用なし
パスワード
   ▼ブーチー さん:

>ちなみに手動で全てのセルを選択しコピペすると、テキストボックスもサイズなど変わらずに貼ることができました。

そうですね。
で、マクロをご希望なので、VBAで実行させると、すぐにリソース不足になり
悪戦苦闘中です。

ところでブーチーさんの環境は 2003以前ですか?2007以降ですか?

【73664】Re:マクロを削除するマクロ
発言  ブーチー  - 13/1/31(木) 12:08 -

引用なし
パスワード
   ▼UO3 さん:

>ところでブーチーさんの環境は 2003以前ですか?2007以降ですか?

2003 win7です。
よろしくお願いいたします。

【73665】Re:マクロを削除するマクロ
発言  UO3  - 13/1/31(木) 19:02 -

引用なし
パスワード
   ▼ブーチー さん:

2010では、セル全体をコピペする動作を繰り返しますと、エクセル障害になりますので
いろいろ細工をしましたが、すんなりとはいきません。
2003ならOKかもしれませんので試してみてください。

なお、実行はフォルダを2つ作り、変換すべきブックを一方のフォルダに格納してください。
マクロの最初で変換元、変換先のフォルダ指定画面がでます。
変換後のブックが同じ名前で変換先に指定したフォルダに保存されます。

Sub Sample()
  Dim fold1 As String
  Dim fold2 As String
  Dim fname As Variant
  Dim sh As Worksheet
  Dim svNewNos As Long
  Dim fromWB As Workbook
  Dim toWB As Workbook
  Dim x As Long
  Dim cl As Collection
  
  Set cl = New Collection
  
  fold1 = getFolder("変換すべきブックのフォルダを選んでください")
  If Len(fold1) = 0 Then Exit Sub
  fold2 = getFolder("変換したブックの保存フォルダを選んでください")
  If Len(fold1) = 0 Then Exit Sub
  
  If fold1 = fold2 Then
    MsgBox "変換目、返還後のフォルダを同じものにすることはできません"
    Exit Sub
  End If
  
  Application.ScreenUpdating = False
  
  svNewNos = Application.SheetsInNewWorkbook
  
  fname = Dir(fold1 & "*.xls")
  
  Do While Len(fname) > 0
    cl.Add fname
    fname = Dir()
  Loop
  
  For Each fname In cl
  
    Set fromWB = Workbooks.Open(fold1 & fname)
    Application.SheetsInNewWorkbook = fromWB.Worksheets.Count
    Set toWB = Workbooks.Add
    x = 0
    For Each sh In fromWB.Worksheets
      x = x + 1
      sh.Cells.Copy toWB.Worksheets(x).Range("A1")
      Application.CutCopyMode = False
      DoEvents
      DoEvents
    Next
    
    fromWB.Close False
    Application.DisplayAlerts = False
    toWB.SaveAs fold2 & fname
    Application.DisplayAlerts = True
    toWB.Close
    
    DoEvents
    DoEvents
    
  Next
  
  Application.SheetsInNewWorkbook = svNewNos
  Application.ScreenUpdating = True
  MsgBox "変換がおわりました"
  
End Sub

Private Function getFolder(msg As String) As String
  Dim myPath As Object
  Dim hWnd As Long
  
  Const BIF_RETURNNONLYFSDIRS = &H1 'ディレクトリのみ選択可
  Const BIF_EDITBOX = &H10 'アイテム名入力用のEdit_boxを表示
  
  hWnd = Application.hWnd
  With CreateObject("Shell.Application")
    Set myPath = .BrowseForFolder(hWnd, msg, BIF_RETURNNONLYFSDIRS Or BIF_EDITBOX)
  End With
  If Not myPath Is Nothing Then getFolder = myPath.Items.Item.Path & "\"
End Function


>▼UO3 さん:
>
>>ところでブーチーさんの環境は 2003以前ですか?2007以降ですか?
>
>2003 win7です。
>よろしくお願いいたします。

【73672】Re:マクロを削除するマクロ
発言  ブーチー  - 13/2/1(金) 9:34 -

引用なし
パスワード
   ▼UO3 さん: 回答ありがとうございました。

実施しましたらうまく行きました。
フォルダに含まれるファイルを一括して処理でき、大変ありがたいです。

但し、以下のような問題もあり、出来ればオリジナルのBOOKからマクロのコードが削除できれば、良いなあと思っています。

<問題点>
1.データをグループ化していたが、解除されてしまう。
2.0(ゼロ)表示をしないという設定が解除されてしまう。
などなど設定が引き継がれたいない。

<更なる要望>(要求ばかりですみません)
シート名が引き継がれていないので、コピー元と同じシート名になるようにしてほしいです。

【73673】Re:マクロを削除するマクロ
発言  UO3  - 13/2/1(金) 10:07 -

引用なし
パスワード
   ▼ブーチー さん:

とりあえずよかったです。


>出来ればオリジナルのBOOKからマクロのコードが削除できれば、良いなあと思っています。

これについては、すでにコメントしましたように、コードのアップは差し控えます。
もちろん、できますので、あくまで自助努力で。

>1.データをグループ化していたが、解除されてしまう。
>2.0(ゼロ)表示をしないという設定が解除されてしまう。
>などなど設定が引き継がれたいない。

これについてはなるほどなぁと。ただし、これをアップした方式で継承するとすれば
ピンポイントで、ある設定に固定して継承するのは、できなくはありませんが
どういう設定がなされているのか、エクセルとして設定できるものは膨大ですから
コードで汎用的に対処するのは、ほぼ不可能でしょうね。
たとえば、シートに保護がかかっていた、それがはずれてしまう 等々。
ピンポイントで、たとえば 0表示設定 などを継承したいのであれば、新規ブック側に
その設定をマクロ内で行ったうえで保存。設定のコードについては、その操作を
マクロ記録すれば生成されますので、それを組み込んでください。

>
><更なる要望>(要求ばかりですみません)
>シート名が引き継がれていないので、コピー元と同じシート名になるようにしてほしいです。

sh.Cells.Copy toWB.Worksheets(x).Range("A1")

この下に

toWB.Worksheets(x).Name = sh.Name

これを追加してください。

いずれにしましても、今後のためにも、これはichinoseさんからアドバイスがありましたが
シートモジュールにはコードをおかず、ThisWorkbookモジュールで対処されるのが
よろしいと思います。
そうしておけば、シートそのものをコピーすれば、シートの設定はすべてそのまま
引き継がれることになりますので。

【73674】Re:マクロを削除するマクロ
発言  UO3  - 13/2/1(金) 10:41 -

引用なし
パスワード
   ▼ブーチー さん:

それと、しつこいようですが、最初に投稿されたのが 1/29 16:24 。
投稿がこの時刻ですから、なんとかしたいと思われたのは、それ以前ですよね。
もう、今日まで4日間ぐらいの時間が経過しています。
それだけの時間があれば、ブックがいくつ、シートがいくつあるのかわかりませんけど
手作業で、シートモジュールのコードを1つずつ消していけば、もう、作業は
とっくの昔におわっていたと思いませんか?

【73675】Re:マクロを削除するマクロ
お礼  ブーチー  - 13/2/1(金) 10:58 -

引用なし
パスワード
   ▼UO3 さん 回答ありがとうございました。


>▼ブーチー さん:
>
>それと、しつこいようですが、最初に投稿されたのが 1/29 16:24 。
>投稿がこの時刻ですから、なんとかしたいと思われたのは、それ以前ですよね。
>もう、今日まで4日間ぐらいの時間が経過しています。
>それだけの時間があれば、ブックがいくつ、シートがいくつあるのかわかりませんけど
>手作業で、シートモジュールのコードを1つずつ消していけば、もう、作業は
>とっくの昔におわっていたと思いませんか?

う〜〜ん。どうしてこういう話になるのか、いつも悩んでしまいますが。
手作業で4日掛けて、直すのが大変である、面倒である、間違えたくないなどの理由でマクロでやろうとしています。

また、対象となるエクセルファイルは毎月送られてくるもので、自分で作っているのもではありません。
以上で回答になりましたでしょうか。

【73676】Re:マクロを削除するマクロ
発言  UO3  - 13/2/1(金) 11:31 -

引用なし
パスワード
   ▼ブーチー さん:

>また、対象となるエクセルファイルは毎月送られてくるもので、自分で作っているのもではありません。

なるほどです。
いずれにしても、私がお手伝いできる範囲はおわりましたので、これで撤退します。

【73682】Re:マクロを削除するマクロ
発言  ichinose  - 13/2/2(土) 9:24 -

引用なし
パスワード
   おはようございます。
シートコピーを行うと、シートモジュールにあるコードも一緒にコピーはされます。
ですから、シートモジュールにあるコードは削除して、同じ機能を構成できるように
Thisworkbookのモジュールの
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

End Sub

↑ここに同じ処理がされるようにVBAコードを記述しては いかがですか?
と申し上げました。このように元ブックを作成しておけば、シートコピーでVBAコードが
コピーされることがないからです。
元ブックのVBAコード構成を変えて運用しては? という提案だったのです。

UO3 さんとのやりとりで
>対象となるエクセルファイルは毎月送られてくるもので、自分で作っているのもではありません。
ということを知りました。
でしたら、送り元にこのように作り直してくれ と依頼するか、
御自分でこのように作り直して、このブックで送ってくれ と要請されては いかがですか?

>出来ればオリジナルのBOOKからマクロのコードが削除できれば
マクロコードを削除するコードは、Excel2002以降は、セキュリティを下げなければ
使用できません。ですから、そのことの危険性を十分に理解していることが大前提になります。
マクロコードを削除したり、変更したり出来るのですから、その設定で運用していたら、
元々マクロがないブックにマクロを付けてコードを実行させることが出来てしまいます。
この危険性を熟知された方が便利に使う機能だと思います。

セキュリティレベルを下げても良いなら・・・、
そもそも御質問された原因は、
>ファイルを開くたびに、マクロを有効にしますかと聞かれるので
でしたね!! セキュリティレベルを「低」に設定すれば、メッセージは出ません。
これで運用されては?

又は、元ブックの送り先にデジタル署名付で送ってもらったらいかがですか?
セキュリティレベル 「中」でも最初だけのメッセージで次回からは、確認メッセージがでません。
(デジタル署名の詳細は、ネット検索してください)。

後は、UO3 さんの提示コードでの問題点の
>1.データをグループ化していたが、解除されてしまう。
>2.0(ゼロ)表示をしないという設定が解除されてしまう


グループ化が解除されているなら、再設定するコードを考える
0表示しない設定は、オプションで設定できるので、0 表示しないという設定にする

というコードをマクロの記録等を利用して作成していくという方法を試してみては
いかがですか?

【73695】Re:マクロを削除するマクロ
お礼  ブーチー  - 13/2/3(日) 8:14 -

引用なし
パスワード
   ▼ichinose さん 回答ありがとうございました。
アドバイスを参考に考えてみます。


>おはようございます。
>シートコピーを行うと、シートモジュールにあるコードも一緒にコピーはされます。
>ですから、シートモジュールにあるコードは削除して、同じ機能を構成できるように
>Thisworkbookのモジュールの
>Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
>
>End Sub
>
>↑ここに同じ処理がされるようにVBAコードを記述しては いかがですか?
>と申し上げました。このように元ブックを作成しておけば、シートコピーでVBAコードが
>コピーされることがないからです。
>元ブックのVBAコード構成を変えて運用しては? という提案だったのです。

1544 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free