Excel VBA質問箱 IV

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

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


9344 / 13644 ツリー ←次へ | 前へ→

【27823】おかしなバグ 青朝顔 05/8/21(日) 14:15 質問[未読]
【27824】Re:おかしなバグ Kein 05/8/21(日) 14:34 発言[未読]
【27826】Re:おかしなバグ かみちゃん 05/8/21(日) 14:41 回答[未読]
【27828】Re:おかしなバグ りん 05/8/21(日) 18:01 発言[未読]
【27830】経過 青朝顔 05/8/21(日) 19:45 発言[未読]
【27831】Re:経過 かみちゃん 05/8/21(日) 19:56 発言[未読]
【27832】ありがとうございました 青朝顔 05/8/21(日) 21:13 お礼[未読]
【27833】新たな問題 青朝顔 05/8/21(日) 21:45 発言[未読]
【27834】Re:新たな問題 かみちゃん 05/8/21(日) 21:55 発言[未読]
【27836】Re:新たな問題 青朝顔 05/8/21(日) 22:54 発言[未読]
【27840】Re:新たな問題 かみちゃん 05/8/21(日) 23:58 発言[未読]
【27907】Re:新たな問題 青朝顔 05/8/23(火) 22:30 お礼[未読]
【27835】Re:経過 りん 05/8/21(日) 21:57 回答[未読]
【27838】Re:経過 青朝顔 05/8/21(日) 23:23 お礼[未読]
【27844】Re:経過 りん 05/8/22(月) 8:37 発言[未読]
【27906】Re:経過 青朝顔 05/8/23(火) 21:56 お礼[未読]

【27823】おかしなバグ
質問  青朝顔  - 05/8/21(日) 14:15 -

引用なし
パスワード
   実は4つの表を置いておいたシートでいらなくなった3つの表を
削除して残りの1つの表を改造してまとめるという作業をしました。
ところがその表はシート保護をかけるとエクセルの十字架であるはずの
ポインターが手型(ボタンを押すときの奴)になってしまい、
表のどこを押しても勝手にマクロが動き出すようになってしまいました。

シート保護をかけないとこの現象は起きず、表意外の所は普通の
ポインターに戻ります。自分なりに原因を考えたのですが、いらない表を
削除したときにボタンだけ隅の方に残ってしまい後で1つづつ切り取ったのですが
その時にボタンがおかしな風に残ってしまったのだろうかという気がします。

コピーして別のシートに表を移動してもこの現象は
残ってしまい、一から作り直すと気が遠くなる作業です。
誰かアドバイスお願いいたします。

【27824】Re:おかしなバグ
発言  Kein  - 05/8/21(日) 14:34 -

引用なし
パスワード
   はっきりした原因はわかりませんが
>ボタンだけ隅の方に残ってしまい
ということなら、問題のシートを開いた状態で

Sub Del_Obj()
  With ActiveSheet
    .DrawingObjects.Delete
    .OLEObjects.Delete
  End With
End Sub

を、実行してみて下さい。うまくいく保証はありませんが・・。

【27826】Re:おかしなバグ
回答  かみちゃん  - 05/8/21(日) 14:41 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>その時にボタンがおかしな風に残ってしまったのだろうかという気がします。

Keinさんとほぼ同じんなのですが、下のコードでボタンのみ(コントロールツー
ルボックスのボタンの場合は、オブジェクト名が限定)を削除することができる
と思います。

Option Explicit

Sub Macro1()
 Dim ws As Worksheet
 Dim myShp As Shape

 Set ws = ActiveSheet 
' 'すべてのシートに対して処理する
' For Each ws In Worksheets

  For Each myShp In ws.Shapes
   Select Case myShp.Type
    'フォーム
    Case msoFormControl
     'コマンドボタン
     If myShp.FormControlType = xlButtonControl Then
      myShp.Delete
     End If
    'コントロールツールボックス
    Case msoOLEControlObject
     'オブジェクト名がCommandButtonで始まる場合
     If myShp.Name Like "CommandButton*" Then
      myShp.Delete
     End If
   End Select
  Next
' Next
End Sub

【27828】Re:おかしなバグ
発言  りん E-MAIL  - 05/8/21(日) 18:01 -

引用なし
パスワード
   青朝顔 さん、こんばんわ。

>コピーして別のシートに表を移動してもこの現象は
>残ってしまい、一から作り直すと気が遠くなる作業です。
>誰かアドバイスお願いいたします。

範囲をコピーして、
 形式を選択して貼り付け → 数式
(同じ位置で)形式を選択して貼り付け → 書式

その後、保護しても同じことになりますか?

【27830】経過
発言  青朝顔  - 05/8/21(日) 19:45 -

引用なし
パスワード
   皆様、連日の質問にレスありがとうございます。
kein様の方法は実行しましたが変化なしです。

かみちゃん様の方法はエラーが出て
myShp.Delete

デバックせよと出てきました。ところで書かれているコードはブック全部の
シートにかかってきてしまうのでしょうか。マクロボタンはブック全体で
20ぐらいあるのでこのシートだけにしたいのですが。

>りん様
その方法ですと行の高さがコピーできないという難点がございまして
120行ぐらいを5種類ぐらいのパターンでモザイクのように使ってある表なので
後で高さを調整するのもやはり気が遠くなるような作業なのです。

【27831】Re:経過
発言  かみちゃん  - 05/8/21(日) 19:56 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>かみちゃん様の方法はエラーが出て
>myShp.Delete
>を
>デバックせよと出てきました。

「デバッグせよ」ではなく「アプリケーション定義またはオブジェクト定義のエラーです」という
エラーメッセージではないでしょうか?
エラーメッセージが出ているなら、その内容を正確に教えてください。
少なくとも「デバッグせよ」というメッセージは聞いたことありません。

それで、その原因ですが、シートの保護をしてあるとそういうエラーになりるのですが、
そのあたりはいかがでしょうか?

>書かれているコードはブック全部のシートにかかってきてしまうのでしょうか。
>マクロボタンはブック全体で20ぐらいあるのでこのシートだけにしたいのですが。

すみません、ややこしい記述になっていますね。
 Set ws = ActiveSheet 
' 'すべてのシートに対して処理する
' For Each ws In Worksheets
ということで、すべてのシートを処理する部分は、コメント文にしてあり、
そのかわり、
 Set ws = ActiveSheet 
で、アクティブシートに対してのみ処理するようにしています。
従いまして、あらかじめ、削除したいシートを選択してから実行してください。

なお、このコードは、以前、以下のように同様の回答をしていまして、そのコードをそのまま流用しています。
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=20889;id=excel

【27832】ありがとうございました
お礼  青朝顔  - 05/8/21(日) 21:13 -

引用なし
パスワード
   >かみちゃん 様

解決できました。保護をはずしてマクロを実行したところ再度保護しても
きれいさっぱり現象はおきなくなりました。

>「デバッグせよ」ではなく「アプリケーション定義またはオブジェクト定義の
>エラーです」というエラーメッセージではないでしょうか?
もうしわけございません。おっしゃるとおりです。

> Set ws = ActiveSheet 
>' 'すべてのシートに対して処理する
>' For Each ws In Worksheets
>ということで、すべてのシートを処理する部分は、コメント文にしてあり、
これはコメント文の部分は実行されないということなのですね。
知識不足で失礼いたしました。

しばらく頭痛の種だった部分が解消できて助かりました。
ありがとうございます。

【27833】新たな問題
発言  青朝顔  - 05/8/21(日) 21:45 -

引用なし
パスワード
   すみません、かみちゃん様の方法で解決したかと思いましたが
別のバグが発生してダメでした。

というのはポインターが正常に戻りマクロが勝手に起動しない
点は解決したのですが、シートの半数以上の関数も消えていました。
それは書き直せばいいのですが新たに関数を入れると外部参照(=)
を使うと全て値がVALUEになります。IF関数を使うと結果を何も
表示しないという状態です。やはりシート自体が壊れているのでしょうか。

気が遠くなりますが一から作り直そうかと考えています。

【27834】Re:新たな問題
発言  かみちゃん  - 05/8/21(日) 21:55 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>すみません、かみちゃん様の方法で解決したかと思いましたが
>別のバグが発生してダメでした。

まったく、原因が別ものだと思います。
「ダメ」なのではなく、ボタンそのものは消えているので、その点については、OKではないでしょうか?

>シートの半数以上の関数も消えていました。
>それは書き直せばいいのですが新たに関数を入れると外部参照(=)
>を使うと全て値がVALUEになります。IF関数を使うと結果を何も
>表示しないという状態です。やはりシート自体が壊れているのでしょうか。

誤解を招かないように申し上げておきますが、私が提示したコードは、関数を消す
ことは一切しておりません。
「シートが壊れている」とは思えませんが、どういう関数を入れていて#VALUE!になっているのかがわからないので、なんともいえません。
保護をかけているから、ボタンが消せなかった。
保護をはずして、コードを実行したらボタンが消せた。
このあと、保護を再度かける前に、セルのクリアか何かをしたのではないでしょうか?
どうも、作業ミスのような気がしてならないのですが・・・

いずれにしても、具体的な事象がわかりません。

【27835】Re:経過
回答  りん E-MAIL  - 05/8/21(日) 21:57 -

引用なし
パスワード
   青朝顔 さん、こんばんわ。

>>りん様
>その方法ですと行の高さがコピーできないという難点がございまして

セル全体を選択してから
 (念のため保護解除)
 コピー
 選択ペースト(数式)
 選択ペースト(書式)
とすると、行高や列幅もペーストされるはずですが。

【27836】Re:新たな問題
発言  青朝顔  - 05/8/21(日) 22:54 -

引用なし
パスワード
   >「ダメ」なのではなく、ボタンそのものは消えているので、その点については、OKではないでしょうか?

何度もすいません。あれこれいじりましたがちょっと複雑でした。
端的に説明するために略していましたがカーソルやマクロ起動の異常はA1〜AN120ぐらいのセルで起きていました(つまり表の内部)。他の部分では正常だったのです。
ですから始めコピペで移動してA〜ANまでの列削除していたのですがやはり新たな
A1〜AN120で異常は残るという状況でした。それからこの表は別のシートに
まったく同じ表があり(異常のあった表はこの表のコピー)200セルぐらいのほとんどのデーターをその表から=を使って反映しているだけなのです。
ほんの一部をIF関数で昨日のデーターが出てきます。
つまり全く入力する所はなく非常時に印刷するだけなので入力するところがないのです。その為いつもシート保護をかけておく必要がありました。
で、ご指導いただいたマクロ1を実行したところ解決したと思われましたが関数が消えて値だけが残っていたのです。で関数を入れ直そうとするとエラーメッセージが出る。(内容は忘れてしまいました)で、元の表の方もおかしいのかと思いこちらにも
マクロ1をかけました。こちらの表の方は印刷ボタンが消えた意外変わりありません。(というか関数は使っていない)

で、再度=を使って見たところVALUEが出ました。説明が混乱して申し訳ないです。

異常が出たのはこちらの元の表の方でした。カーソル以上のあった方をシート2として、シート2がデーターを引っ張っていた表の方をシート1とします。

シート2の方は関数が消えた以外何も起きていません。シート1の方は
他のどのシートからデーターを引っ張ろうとしてもVALUEが出るようになりました。
保護の有無に関わらずです。使う関数は単純に='sheet1'!A1という形です。

【27838】Re:経過
お礼  青朝顔  - 05/8/21(日) 23:23 -

引用なし
パスワード
   りん様ご意見ありがとうございます。

>セル全体を選択してから
> (念のため保護解除)
> コピー
> 選択ペースト(数式)
> 選択ペースト(書式)
>とすると、行高や列幅もペーストされるはずですが。

この方法でやってみましたが行高や列福はコピーできず巨大な
表ができてしまいました。

【27840】Re:新たな問題
発言  かみちゃん  - 05/8/21(日) 23:58 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>何度もすいません。あれこれいじりましたがちょっと複雑でした。

まったく、何がなんだかわからなくなりました。
異常が起きるというか、ボタンが消えていないだけで、異常ではないと思います。
さきほどのコードを実行すると、ボタンは消えるわけですから、マクロが起動するという「異常」は
起こらなくなっていると思いますが、いかがでしょうか?

これと、今回の関数式が消えているのは、まったく別問題です。

>ほんの一部をIF関数で昨日のデーターが出てきます。

「昨日のデータ」というのがよくわかりません。

>で、ご指導いただいたマクロ1を実行したところ解決したと思われましたが関数が消えて値だけが
>残っていたのです。で関数を入れ直そうとするとエラーメッセージが出る。(内容は忘れてしまい
>ました)

さきほども言いましたが、私が提示したコードだけを使うと、関数は消えません。
関数を消すコードは一切ありませんから。
「コピー」−「形式を選択して貼り付け」の「値」をしたのではないでしょうか?
エラーメッセージが出て、その内容は忘れたと言われましても、こちらではまったくわかりません。
せめて、再度関数を入れなおすことを再現させて、エラーメッセージの確認をしていただけないでし
ょうか?

>で、再度=を使って見たところVALUEが出ました。説明が混乱して申し訳ないです。

ですから、その関数式は、何ですか?
「#VALUE!」と一言言われても、どういう数式になっていて、その参照先にどういう値が入っている
のか、青朝顔さんのシートがこちらには見えているわけではないことをご理解いただけないでしょ
うか?

>他のどのシートからデーターを引っ張ろうとしてもVALUEが出るようになりました。
>保護の有無に関わらずです。使う関数は単純に='sheet1'!A1という形です。

='Sheet1'A1
Sheet1のA1が#VLAUE!になっていない限り問題ないと思いますが?
「他のどのシートからデーターを参照しようとしても」というところに疑問を感じます。
「再計算」が「手動」になっているとかいうことないですよね?

【27844】Re:経過
発言  りん E-MAIL  - 05/8/22(月) 8:37 -

引用なし
パスワード
   青朝顔 さん、おはようございます。

>>行高や列幅もペーストされるはずですが。
>この方法でやってみましたが行高や列福はコピーできず巨大な
>表ができてしまいました。

行/列全体で選択していれば、大丈夫なはずなんですけどねぇ。

上の手順をマクロにするとこんな感じです。複製したいシートを表示して実行してください。念のため、行列サイズ調整を入れたシートも作りますので、1と2で比較してみてください。
Sub test()
  Dim ws1 As Worksheet, ws2 As Worksheet, II&
  '
  Set ws1 = ActiveSheet
  ws1.Unprotect '保護解除
  'コピペのみ(普通はこれで大丈夫のはず)
  Set ws2 = ws1.Parent.Worksheets.Add(before:=ws1)
  ws2.Name = ws1.Name & "の複製その1"
  ws1.Cells.Copy
  With ws2.Cells(1)
   .PasteSpecial Paste:=xlPasteFormulas
   .PasteSpecial Paste:=xlPasteFormats
   .Select
  End With
  Application.CutCopyMode = False
  'コピペ後、行/列調整
  Set ws2 = ws1.Parent.Worksheets.Add(before:=ws1)
  ws2.Name = ws1.Name & "の複製その2"
  ws1.Cells.Copy
  With ws2.Cells(1)
   .PasteSpecial Paste:=xlPasteFormulas
   .PasteSpecial Paste:=xlPasteFormats
   .Select
  End With
  Application.CutCopyMode = False
  With ws1.UsedRange
   '行高調整
   For II& = .Cells(1).Row To .Cells(.Count).Row
     ws2.Rows(II&).RowHeight = ws1.Rows(II&).RowHeight
   Next
   '列幅調整
   For II& = .Cells(1).Column To .Cells(.Count).Column
     ws2.Columns(II&).ColumnWidth = ws1.Columns(II&).ColumnWidth
   Next
  End With
  Set ws1 = Nothing: Set ws2 = Nothing
End Sub

【27906】Re:経過
お礼  青朝顔  - 05/8/23(火) 21:56 -

引用なし
パスワード
   >りん様

夜勤だったため御返事できずにすいません。
前回の、セル全体を選んで、という言葉を表のセル全部を選んでと
解釈しておりました。

>行/列全体で選択していれば、大丈夫なはずなんですけどねぇ。
を読んでシートの一番左上を右クリックする意味だとわかりました。

この方法でやると大変うまくいきました。ポインターやマクロの異常だけでなく
別シートからのデーター参照もうまくいっております。

せっかくコードを示していただきましたが、これ以上何かをするのも
怖いので選択コピー技だけで終わらせます。余分にお手間掛けさせました。
ありがとうございました。

【27907】Re:新たな問題
お礼  青朝顔  - 05/8/23(火) 22:30 -

引用なし
パスワード
   >かみちゃん様

>まったく、何がなんだかわからなくなりました。
申し訳ございません。バグシートが二つあった為私自身が正確に症状を掴んでいませんでした。そこでバグをわかりやすくするためバグシートを1つだけにして、かみちゃんさんのマクロ1を試してみました。

まずバグの症状は。
1)シート保護をかけるとポインターが手形になり、表のどこをクリックしてもマクロ発動。表以外の部分にはこの現象はおきない。

2)保護の有無に関わらずこの表のどのセルに対してもに別シートからデーターを引っ張れない。(例えば=セル番地の関数)エラーメッセージは”数式に無効な外部参照が含まれます”と出ます。これは別シートのセルに=と書いた後、問題の表をクリックしようとするとやはりポインターが手形になり(保護をかけなくても)
実際にクリックできていない為のようです。=セル番地をキーボードで入力するとOK

このバグシートにかみちゃんさんのマクロ1をかけます。
1)の症状は消えました。2)の症状の方はポインターは正常になり
クリックできるようになりましたが、全てVALUEになります。(保護の有無に寄らない)(関数は=セル番地、データーは単純な”あ”とか”B”とかいう文字列)
表以外の部分はこれらは正常に行えます。

それからふざけているように思われてしまうかもしれませんが真面目に話を続けます。シート外からだとVALUEになるがシート内ではどうだろうと試してみました。
すると=セル番地で文字列を引っ張ると、なんと文字列の巡が逆になるのです。

つまり”備考”という文字列を引っ張ると”考備”
”ABC”は”CBA”と表示されます。嘘偽りなく本当の話です。

以上相談に乗っていただいた手前、あやふやなまま終わらせたくなかったので
自分なりに実験をし報告させていただきました。
表作成上の解決方法としてはりん様のアドバイスでやっていこうと考えております。
未熟なレスで混乱させて申し訳ありませんでした。

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