Excel VBA質問箱 IV

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

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


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

【55709】セルが条件を満たせば、オートシェイプで線を引きたい マリアン 08/5/16(金) 13:01 質問[未読]
【55710】Re:セルが条件を満たせば、オートシェイプ... わいわい 08/5/16(金) 13:46 発言[未読]
【55712】Re:セルが条件を満たせば、オートシェイプ... Jaka 08/5/16(金) 14:55 発言[未読]
【55715】Re:セルが条件を満たせば、オートシェイプ... マリアン 08/5/16(金) 15:41 質問[未読]
【55717】Re:セルが条件を満たせば、オートシェイプ... Jaka 08/5/16(金) 16:16 発言[未読]
【55720】やっぱり忘れてました。修正 Jaka 08/5/16(金) 16:49 発言[未読]
【55721】Re:セルが条件を満たせば、オートシェイプ... マリアン 08/5/16(金) 17:04 お礼[未読]
【55722】Re:セルが条件を満たせば、オートシェイプ... わいわい 08/5/16(金) 17:24 発言[未読]
【55806】Re:セルが条件を満たせば、オートシェイプ... マリアン 08/5/20(火) 10:47 質問[未読]
【55816】Re:セルが条件を満たせば、オートシェイプ... Jaka 08/5/20(火) 13:28 発言[未読]
【55818】Re:セルが条件を満たせば、オートシェイプ... マリアン 08/5/20(火) 14:28 質問[未読]
【55820】Re:セルが条件を満たせば、オートシェイプ... わいわい 08/5/20(火) 16:09 発言[未読]
【55857】Re:セルが条件を満たせば、オートシェイプ... マリアン 08/5/21(水) 14:08 質問[未読]
【55869】Re:セルが条件を満たせば、オートシェイプ... Jaka 08/5/21(水) 15:33 発言[未読]
【55887】Re:セルが条件を満たせば、オートシェイプ... マリアン 08/5/22(木) 10:44 お礼[未読]

【55709】セルが条件を満たせば、オートシェイプで...
質問  マリアン  - 08/5/16(金) 13:01 -

引用なし
パスワード
   エクセル2003を私用しています。

J27>0のとき、別のセル(複数)の対角をとる線を引きたいのですが、
以下のようなマクロを組んでみましたが、実行できません。

J27に数値を入力しても、線が引けないだけでなく、
保護も解除されたままとなってしまいます。

どのように修正すべきでしょうか。
よろしくご教示ください。
=================

Sub Macro3()

If j27 > 0 Then
    
    ActiveSheet.Unprotect
  
  ActiveSheet.Shapes.AddLine(18.75, 700.5, 549#, 758.25).Select
  Selection.ShapeRange.Flip msoFlipHorizontal
  ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
  
 End If


End Sub

【55710】Re:セルが条件を満たせば、オートシェイ...
発言  わいわい  - 08/5/16(金) 13:46 -

引用なし
パスワード
   マリアン さんこんにちは

・If j27 > 0 Then

セル J27 の数値を0と比較したいんですよね。
If Range("j27").Value > 0 Then
または、
If [j27].Value > 0 Then
という感じになります。

参考コード例
With ActiveSheet
  If .Range("j27").Value > 0 Then
    .Unprotect
    .Shapes.AddLine(18.75, 700.5, 549#, 758.25).Select
    Selection.ShapeRange.Flip msoFlipHorizontal
    .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
  End If
End With

上記の様に インデントをつけたり Withでまとめたほうがすっきりします。

【55712】Re:セルが条件を満たせば、オートシェイ...
発言  Jaka  - 08/5/16(金) 14:55 -

引用なし
パスワード
   50行目あたりにでかいXが出来てましたよ。

Dim Tp As Double, Lt As Double, Rt As Double, Un As Double

With Selection
  Tp = .Top
  Lt = .Cells(1).Left
  Rt = .Cells(.Count).Offset(, 1).Left
  Un = .Cells(.Count).Cells.Offset(1).Top
End With
ActiveSheet.Shapes.AddLine(Lt, Tp, Rt, Un).Select
Selection.ShapeRange.Flip msoFlipHorizontal
ActiveSheet.Shapes.AddLine(Lt, Tp, Rt, Un).Select

PS
>ShapeRange.Flip msoFlipHorizontal
これを使う前提だと選択しないとダメ?みたいだったんで、
Dim Shp As Shape
Set Shp = ActiveSheet.Shapes.AddLine(Lt, Tp, Rt, Un)
この手の物は却下しました。
計算して入れなおせば良いんだけどね。

【55715】Re:セルが条件を満たせば、オートシェイ...
質問  マリアン  - 08/5/16(金) 15:41 -

引用なし
パスワード
   わいわいさん、Jaka さん、ありがとうございます。

私の説明不足だったのですが、
J27に何か数値を入力すると同時に、
自動的にマクロを実行してくれるようにしたいのです。
マクロの実行方法を知らない人でも、
J27に数値を入力するだけで、
任意のセルに線が引けている・・・
という状態が理想なのですが・・。
このようなことはできないでしょうか。

【55717】Re:セルが条件を満たせば、オートシェイ...
発言  Jaka  - 08/5/16(金) 16:16 -

引用なし
パスワード
   Selection
 ↓
Range("C10:G20")
とかに直せば良いです。

Un = .Cells(.Count).Cells.Offset(1).Top
  ↓修正
Un = .Cells(.Count).Offset(1).Top

また、セルに値を入力するとよりボタンの方がいいと思いますけどね。
ただ、何個も同じ所に重ねて作るようになるから、最初に消した方が良いです。

On Error Resume Next
ActiveSheet.Shapes("線1").Delete
ActiveSheet.Shapes("線2").Delete

作る時は、
ActiveSheet.Shapes.AddLine(Lt, Tp, Rt, Un).Select
Selection.Name = "線1"
Selection.ShapeRange.Flip msoFlipHorizontal
ActiveSheet.Shapes.AddLine(Lt, Tp, Rt, Un).Select
Selection.Name = "線2"

>J27に数値を入力するだけ
にこだわるなら、シートモジュールのWorksheet_Changeを
使ったら良いと思います。

一応
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address(0, 0) = "J27" Then
  If Not IsEmpty(Target.Value) Then
   ここに線を書くコード
  End If
End If
End Sub

【55720】やっぱり忘れてました。修正
発言  Jaka  - 08/5/16(金) 16:49 -

引用なし
パスワード
   なんか勘違いしそうですね。
>Selection
> ↓
>Range("C10:G20")

With Selection
    ↓
With Range("C10:G20")

【55721】Re:セルが条件を満たせば、オートシェイ...
お礼  マリアン  - 08/5/16(金) 17:04 -

引用なし
パスワード
   Jaka さんへ

発想の転換ができました。
シートモジュールのWorksheet_Changeを
使って解決できました。

ありがとうございました。

【55722】Re:セルが条件を満たせば、オートシェイ...
発言  わいわい  - 08/5/16(金) 17:24 -

引用なし
パスワード
   マリアン さん 解決良かったですね。
Jaka さん フォローありがとうございます。
めずらしく長文でしたね。(ちょっとびっくり)

【55806】Re:セルが条件を満たせば、オートシェイ...
質問  マリアン  - 08/5/20(火) 10:47 -

引用なし
パスワード
   Jaka さん、わいわいさん、ありがとうございました。

▼Jaka さんからおしえていただいた下記コードで、
線を引くことはできたのですが、
そのコードに加えて、
今度は、J27の数値がdeleteされたら、
自動的に、引かれた線を消す・・
ということは可能でしょうか。
線が引かれている範囲は、A51:AS54の範囲です。

================

>>J27に数値を入力するだけ
>にこだわるなら、シートモジュールのWorksheet_Changeを
>使ったら良いと思います。
>
>一応
>Private Sub Worksheet_Change(ByVal Target As Range)
>If Target.Address(0, 0) = "J27" Then
>  If Not IsEmpty(Target.Value) Then
>   ここに線を書くコード
>  End If
>End If
>End Sub

【55816】Re:セルが条件を満たせば、オートシェイ...
発言  Jaka  - 08/5/20(火) 13:28 -

引用なし
パスワード
   ▼マリアン さん:
>今度は、J27の数値がdeleteされたら、
>自動的に、引かれた線を消す・・
という事だけ見れば、書きコードに判定を追加するだけです。

>>If Target.Address(0, 0) = "J27" Then
>>  If Not IsEmpty(Target.Value) Then
>>   ここに線を書くコード
>>  End If
>>End If
>>End Sub

>ということは可能でしょうか。
>線が引かれている範囲は、A51:AS54の範囲です。
これは、どうやって線を作っているのかで変わってきます。
線に特定の名前をつけているのなら
下記コードの様にすれば良いです。

>ただ、何個も同じ所に重ねて作るようになるから、最初に消した方が良いです。

>On Error Resume Next
>ActiveSheet.Shapes("線1").Delete
>ActiveSheet.Shapes("線2").Delete

そうでないのなら面倒な事をしないとダメです。
面倒なので活用した事がないですが。
全ての図形オブジェクトを1個1個しらべ
たった2つしかない、TopLeftCell、BottomRightCellプロパティで場所判定するような感じになります。
おまけに、微妙な位置にある場合の判定が結構ザルみたいです。

Sub mmmmmm()
Dim Sap As Shape
Set Sap = ActiveSheet.Shapes(Selection.name)
Sap.TopLeftCell.Select
MsgBox "選択した図形の左上に当る位置のセルを選択しました。"
Sap.BottomRightCell.Select
MsgBox "選択した図形の右下に当る位置のセルを選択しました。"
End Sub

【55818】Re:セルが条件を満たせば、オートシェイ...
質問  マリアン  - 08/5/20(火) 14:28 -

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

早速ありがとうございます。
私の説明が不十分だったのですが、
範囲指定の中の線というのは、
つまり、下記のコードで引いた線のことです。

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address(0, 0) = "J27" Then
  If Not IsEmpty(Target.Value) Then

  ActiveSheet.Shapes.AddLine(18.75, 702#, 547#, 758.25).Select
  Selection.ShapeRange.Flip msoFlipHorizontal
    
  End If
End If
End Sub

j27の数値をdeleteしたときに、
このコードで引いた線を消したいのですが・・・。

それから、あわせてお尋ねしたいのですが、
j27だけでなく、j37も、データが入力されたら、
線を引きたい場合、
つまり、二つのセルのどちらかに数値データが入力された場合、
線を引きたいのですが、
どのように、コードをつなげると良いでしょうか。
orでつなげると、エラーになってしまいました。

たくさん、質問してもうしわけありません。
よろしくお願いいたします。

【55820】Re:セルが条件を満たせば、オートシェイ...
発言  わいわい  - 08/5/20(火) 16:09 -

引用なし
パスワード
   マリアン さん今日は
>私の説明が不十分だったのですが、
Jakaさんには充分伝わっていたはずです。

>これは、どうやって線を作っているのかで変わってきます。

Sub 線作成1()
Dim sen As Shape
 Set sen = ActiveSheet.Shapes.AddLine(18.75, 702#, 547#, 758.25)
 sen.Name = "Abebobo"
 sen.Flip msoFlipHorizontal
End Sub

上記コードのように線を作るときに名前を付けてやれば良いでしょう。
しかし、2回目からはエラーが出ます。

そこで
>線に特定の名前をつけているのなら
>下記コードの様にすれば良いです。
>ただ、何個も同じ所に重ねて作るようになるから、最初に消した方が良いです。

Sub 線作成2()
Dim sen As Shape
 On Error Resume Next
 ActiveSheet.Shapes("Abebobo").Delete
 Set sen = ActiveSheet.Shapes.AddLine(18.75, 702#, 547#, 758.25)
 sen.Name = "Abebobo"
 sen.Flip msoFlipHorizontal
End Sub

’ActiveSheet.Shapes("Abebobo").Delete
で線を指定して消してから作ってやれば何回でもできます。
ただ、線が無い状態で ’ActiveSheet.Shapes("Abebobo").Delete
を実行するとエラーになっちゃいますので
On Error Resume Next
というおまじないをかけます。

あとは、IF文で分岐させてやればできます。

>orでつなげると、エラーになってしまいました。
If Target.Address(0, 0) = "J27" Or Target.Address(0, 0) = "J37" Then

【55857】Re:セルが条件を満たせば、オートシェイ...
質問  マリアン  - 08/5/21(水) 14:08 -

引用なし
パスワード
   わいわい さんへ

今回もありがとうございました。
おかげさまで、ifの分岐の方法は解決しました。
助かりました。ありがとうございました。

さて、ご指導いただいたように
、以下のコードでは線は引けるのですが、
やはり、j27、あるいは、j35のセルの数値をdeleteしても、
引かれた線が消えないのですが・・。
どこか手を加えないといけないでしょうか。
線の名前は、ワイワイさんの名づけをそのまま利用させていただいています。
何度ももうしわけありません。

=================================

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address(0, 0) = "J27" Or Target.Address(0, 0) = "J37" Then

  If Not IsEmpty(Target.Value) Then

  Dim sen As Shape
 On Error Resume Next
 ActiveSheet.Shapes("Abebobo").Delete
 Set sen = ActiveSheet.Shapes.AddLine(18.75, 702#, 547#, 758.25)
 sen.Name = "Abebobo"
 sen.Flip msoFlipHorizontal
   
  End If
End If
End Sub

【55869】Re:セルが条件を満たせば、オートシェイ...
発言  Jaka  - 08/5/21(水) 15:33 -

引用なし
パスワード
   >If Target.Address(0, 0) = "J27" Or Target.Address(0, 0) = "J37" Then
もし、対象セルのアドレスが、J27かJ37だったら

>  If Not IsEmpty(Target.Value) Then
  もし、対象セルが空白でなかったら。

>  Dim sen As Shape
> On Error Resume Next
> ActiveSheet.Shapes("Abebobo").Delete
> Set sen = ActiveSheet.Shapes.AddLine(18.75, 702#, 547#, 758.25)
> sen.Name = "Abebobo"
> sen.Flip msoFlipHorizontal
  'ここまでが対象セルが空白でなかったときの処理。
   
>  End If
>End If
>End Sub

これで、対象セルが空白だった時の処理が書かれていないのがわかると思います。

【55887】Re:セルが条件を満たせば、オートシェイ...
お礼  マリアン  - 08/5/22(木) 10:44 -

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

ご教示、ありがとうございました。
j27に何度データを入力しても、
最終的には1本の線が引かれることで、
問題は解決しました。
ありがとうございました。

わいわいさんにも、お礼申し上げます。
ありがとうございました。

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