エクセルのVBAでエラー解消できません



 ◇-?エクセルのVBAでエラー解消できません-ネコの親-10/22-14:37(180)-No.463004
   ┗??Re:エクセルのVBAでエラー解消で...-ネコの親-10/22-17:40(177)-No.463012
     ┗??!Re:エクセルのVBAでエラー解消...-はも-10/22-20:24(174)-No.463021
       ┗??!?Re:エクセルのVBAでエラー解消...-ネコの親-10/23-09:58(160)-No.463064
         ┗??!?【解決】Re:エクセルのVBAでエ...-ネコの親-10/23-11:18(159)-No.463067
           ┗??!?K!Re:エクセルのVBAでエラー解...-はも-10/23-19:46(151)-No.463110
             ┗??!?K!?Re:エクセルのVBAでエラー...-ネコの親-10/24-09:45(137)-No.463161
               ┗??!?K!?!Re:エクセルのVBAでエラー...-はも-10/24-12:44(134)-No.463188
                 ┗??!?K!?!-Re:エクセルのVBAでエラ...-ネコの親-10/25-23:15(99)-No.463286
                   ┗??!?K!?!-?Re:エクセルのVBAでエラ...-ネコの親-10/26-08:52(89)-No.463308
                     ┗??!?K!?!-?!Re:エクセルのVBAでエ...-はも-10/26-13:04(85)-No.463327
                       ┗??!?K!?!-?!【解決】Re:エクセルの...-ネコの親-10/27-19:01(55)-No.463444

▲このページのトップに戻る
463004エクセルのVBAでエラー解消できませんネコの親 2008/10/22-14:37

メーカー名:富士通
OS名:WindowsXp
パソコン名:wakarimasenn
トラブル現象: VBA
ソフト関連:表計算Excel
--
業務の調査シートを作っています。入力シートの制御で、ワークシートチェンジを使って
特定のセルが再入力されたら、他を消すようなことを、行と列の番号で指定してやってる
つもりなのですが、
入れてあったデータをDELETEで消すと、エラーになってしまいます。
行や列の該当のところでない場合もデリートするとエラーになるところがあるようです。
どうしてだかわからなくて困っています。
期限も近いのであせっています。どなたか教えてくれないでしょうか。

Private Sub Worksheet_Change(ByVal Target As Range)

r = Target.Row
c = Target.Column
V = Target.Value

If r > 15 And c = 12 Then
Target.Offset(0, 2).Value = ""
Target.Offset(0, 7).Value = ""
Target.Offset(0, 11).Value = ""

ElseIf r > 15 And c = 15 And V = "総務・庶務" Then
Target.Offset(0, 2).Value = V
Target.Offset(0, 6).Value = "31総務・庶務業務"

ElseIf r > 15 And c = 15 And V = "休憩" Then
Target.Offset(0, 2).Value = V
Target.Offset(0, 6).Value = "32休憩(昼休み・タバコ等)"

ElseIf r > 15 And c = 20 Then
Target.Offset(0, 2).Value = ""

ElseIf r = 9 And c = 7 Then

Range("g16:h115,k11, m11, u9, y11, aa11, l16:m115,o16:r115, t16:v115, x16:au115").Select

Selection.ClearContents
Range("u9").Select

Else: Exit Sub
End If
End Sub


▲このページのトップに戻る
463012Re:エクセルのVBAでエラー解消できませんネコの親 2008/10/22-17:40

記事番号463004へのコメント
エラーの内容は、
型が合いませんとなり、

デバックで
> ElseIf r > 15 And c = 15 And V = "総務・庶務" Then
ここが反転します。

よろしくお願いします。

▲このページのトップに戻る
463021Re:エクセルのVBAでエラー解消できませんはも 2008/10/22-20:24

記事番号463012へのコメント
ネコの親さんは No.463012「Re:エクセルのVBAでエラー解消できません」で書きました。

ざっといじってみた感じでは、範囲指定で削除、行や列自体を削除、範囲指定でコピーした値を適当にペーストで、同様のエラーが発生しますね。
共通点は複数のセルがChangeされた時かと。
この場合、Target.valueは配列型(二次元)が返るため、「V="総務・庶務"」といった評価式は型エラーとなるのでしょう。
とりあえず、以下のどちらかで範囲指定状態での操作に対応すべきでは?

(1)範囲指定されていても、左上のセルしか評価しない(cells(r,c)など)

(2)範囲指定されているセルすべてを評価する(For Eachなど)

ただ、上記対応をしても行や列自体を削除した場合への対応は別に必要な気がしますよ。

▲このページのトップに戻る
463064Re:エクセルのVBAでエラー解消できませんネコの親 2008/10/23-09:58

記事番号463021へのコメント
はも様

ありがとうございます。
当該調査シートは、リスト選択で入力をしていくので、保護をかければ行や範囲で
削除されることは防げるのですが、リスト選択したものをdeleteキーで消すことは
大いに考えられます。
リスト選択で””にはできるけれど、deleteキーは使えないようにするのは無理で
しょうか。
すみません、対策としてあげていただいた、(1)、(2)はどうやればいいのか
わからなくて。


▲このページのトップに戻る
463067Re:エクセルのVBAでエラー解消できませんネコの親 2008/10/23-11:18

記事番号463064へのコメント
ネコの親さんは No.463064「Re:エクセルのVBAでエラー解消できません」で書きました。
はも様

教えていただいた(1)の cells(r,c)でできました!
deleteしてもエラーにならないです。
どうしてだかは、20%くらいしかわかっていませんが
ありがとうございました。
ステキになりそうです。

▲このページのトップに戻る
463110Re:エクセルのVBAでエラー解消できませんはも 2008/10/23-19:46

記事番号463067へのコメント
ネコの親さんは No.463067「Re:エクセルのVBAでエラー解消できません」で書きました。
エラーが解決してなによりです^^

リスト選択による入力ということで、思いっきり私の回答は外れてましたが・・・><

たぶん、 「v=target.value」を「v=cells(r,c)」に変更されたのだと思います。
target.valueに入ってくる値は入力された内容なのですが、DELETEの場合はそもそも「削除」されているため、「値がないよ」を意味するNullもしくはEmptyが入っていると思われます。
そのため、「v = "総務・庶務"」といったように値が入っていることを前提とした評価式で型エラーとなっているのでしょう。

これに対してcells(Row,Column)は、シート上の任意のセルの値が返ってくるため、DELETEされたとしてもNullなどではなく""(ブランク文字列)がvに入ります。
そのため、「v = "総務・庶務"」といった評価式が正常に処理されるため、めでたくエラー解消となったのでしょう。

▲このページのトップに戻る
463161Re:エクセルのVBAでエラー解消できませんネコの親 2008/10/24-09:45

記事番号463110へのコメント
はも様
ありがとうございました。

vはそのままにして、"総務・庶務"か検査するところだけcellc(r,c)にしていたので
はもさんの言われるように、vを直しました。また別の検査したいときにわかりやすい
ですよね。

もうひとつお聞きしてもいいでしょうか。
贅沢な悩みとも思いますが。

調査シートの他に非表示でデータやリストを入れているシートがあります。
そこの値をvbaでsheets(●●).range("●").valueで取得しようとすると、エラーに
なります。vbaで.Visible = True にしてからにしますが、そうすると、実行した
時に、画面上でシートがめまぐるしく表示されたり消えたりして、スマートじゃあり
ません。何か方法があるのではないかと思いますが、なんと検索したらいいかも
わからなくて疑問のままです。
そんな技はないのでしょうか。


▲このページのトップに戻る
463188Re:エクセルのVBAでエラー解消できませんはも 2008/10/24-12:44

記事番号463161へのコメント
ネコの親さんは No.463161「Re:エクセルのVBAでエラー解消できません」で書きました。
ざっと試したところでは、VisibleプロパティがFalseになっているシートに対して、sheets(●●).range("●").valueを使用しても特にエラーは発生せず、正常に値の取得が出来ているようです。
考えられる違いとしては、ExcelやOSのバージョンでしょうかね? 
私が試した環境は、WindowsXP SP2 + Excel2003 になります。

一応、以下が試したコードです。
・前提
Book上には、Sheet1というシートと、Sheet2というシートを配置
Sheet1 のVisible=True
Sheet2 のVisible=False

●パターン1(Sheet1にボタンを配置し、標準モジュールのプロシージャを呼びだす)
Sub ボタン1_Click()
v = Sheet2.Range("A1:A1").value
MsgBox v
End Sub


●パターン2(Sheet1のWorksheet_Changeにコードを記述)
Private Sub Worksheet_Change(ByVal Target As Range)
v = Sheet2.Range("A1:A1").value
MsgBox v
End Sub

▲このページのトップに戻る
463286Re:エクセルのVBAでエラー解消できませんネコの親 2008/10/25-23:15

記事番号463188へのコメント
はもさんは No.463188「Re:エクセルのVBAでエラー解消できません」で書きました。

はもさま
本当ですか???ショックです。なんでだろう。
月曜に会社へ行ったら、もう一度やってみます。でも、前にも同じようなエラーが
出てシートを表示してから最後にまた非表示にした覚えがあります。
XPだしエクセルも2003です。なぜだろう・・・書き方が悪かったのかしら。

家のパソコンでやってみたいのですが、OSもエクセルのバージョンも違うので、
なにしろ自分でやりたいことが、メニューから探せないのです。
今も列の表示をABCから123に変えようとして、見つけられずに断念しました・・・
VBAの記述も書き足したところは動かないし・・・
エクセル2007、ほんとに困ります。

なにしろ、月曜日にやってみるのが楽しみです。

▲このページのトップに戻る
463308Re:エクセルのVBAでエラー解消できませんネコの親 2008/10/26-08:52

記事番号463286へのコメント
はもさま
すみません、勘違いだったかもしれません。
sheets().rannge().value
ではなくて、シートの範囲をコピーして、別のシートに貼り付ける
worksheet().select
range.("a1:c1").select
で、エラーだったように思いなおしました。
これだと、非表示だとだめですか?selectなのだから当たり前なのですか?
selectしないでコピーはできないですよね。


とんちんかんでご迷惑をおかけします。

▲このページのトップに戻る
463327Re:エクセルのVBAでエラー解消できませんはも 2008/10/26-13:04

記事番号463308へのコメント
ネコの親さんは No.463308「Re:エクセルのVBAでエラー解消できません」で書きました。
あ、selectであれば、エラーになりますね。

ということで当初のご要望に沿う方法としては、application.ScreenUpdatingを使う手があります。
これは、Excel内の変更の画面上に反映させるか否かのプロパティです。
使い方としては以下のような感じです。

application.ScreenUpdating = False

Sheet2.Visible = True
Sheet2.Range("A1:C1").select
'Sheet2の選択範囲に対する処理諸々
Sheet2.Visible = False

application.ScreenUpdating = True

application.ScreenUpdating がFalseに設定している間は画面が更新されないので、シートの表示・非表示を行っても目に付くことはありません。
ただ、非表示にしているシートの特定の選択範囲を、別のシートにコピーしたいということであれば以下の方がシンプルかも知れません。

・前提
Sheet2.Visible = False

●コード例
Sheet2.Range("A1:C4").copy Sheet1.Range("B2")


※これは、シートSheet2のA1〜C4の値を、シートSheet1のB2〜に貼り付ける意味になります。
※因みに、コピー先を指定せずにcopyメソッドを実行した場合は、クリップボードにコピーされます。
※copyメソッドは、非表示になっているシートに対して実行することが出来るため、この場合は「Sheet2.visible=true」などを記述する必要はありません

★少々補足のため修正しました

▲このページのトップに戻る
463444Re:エクセルのVBAでエラー解消できませんネコの親 2008/10/27-19:01

記事番号463327へのコメント
はもさんは No.463327「Re:エクセルのVBAでエラー解消できません」で書きました。
はもさま

コピーする時に、データの入っている最後の行を探したり、フィルタをかけたりしていた
ので、application.ScreenUpdating = False のほうを使ってみました。

感動的にステキです。
いろいろなところを選択するところが次々めまぐるしくてイヤだったのが、最初の
画面からじっと何も動かないままさっとメッセージボックスが表示されるように
なりました。すっごくスマート!

本当に感謝です。ありがとうございました。またよろしくお願いします。
(^ O ^)/

A1.本ページは参考になりましたか? 又はアドバイスがありますか?
解決 参考になった 参考にならなかった アドバイスする

A2.何度目の訪問ですか?
初めて来た   数度目(2〜4) 5回以上来ている   管理人:

A3.何か一言どうぞ(アドレスは書くことができません)

A4.アドレスがあればどうぞ(1つまで)


↑↑↑↑よろしければ押してください↑↑↑↑

何か一言(本ページで参考になったならないを含めて残してあります)
◎:解決 ○:参考になった ×:参考にならなかった !:アドバイスあり

参考回数投稿日時何か一言
数度目2008/11/02/(日) 07:29:01すごく親切に教えていただいて、とても助かりました。ありがたかったです。Netscape4/WinNT