[[20070530220214]] 『エクセルVBAで罫線を引き文字を表示する。』(T) ページの最後に飛ぶ

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

 

『エクセルVBAで罫線を引き文字を表示する。』(T)
入力規則からリストをつくり、そのリストから選択するものによってとセルに四角の罫線をひき中に色々な文字を表示させたいのですが借りてきた本には載っていません。
(できるexcelVBA excelvba大全集等)
どのようなプログラムを組めばよいのでしょうか?

 1) まず、やりたいことを順番に箇条書きにする。
 2) 1) をマクロの記録でコードを生成する。
 これで殆どできそうですが?
 (seiya)

1) まず、やりたいことを順番に箇条書きにする。
 2) 1) をマクロの記録でコードを生成する。
 これで殆どできそうですが?
 (seiya)

マクロは作業を記録するだけなんじゃないでしょうか?リストボックスからある言葉を選んだときは枠線を引き違うことばを選んだときは枠線を消す。これはVBAしかできないと思うのですが??
しかしVBAを開くと変なフォームが出てきたりするし(><)
私は、VBAのようなフォームではなくA1、A2とかのセルの状態からリストボックスで選んで罫線を引きたいのですがVBAでは感じが違う、マクロでは実現できなさそうで八方ふさがりです。


 VBAコード と マクロの記録でコードを生成 は同じものですよ。

 一例:

 Private Sub Worksheet_Change(ByVal Target As Range)
 With Target
      If Intersect(.Cells, Range("a1")) Is Nothing Then Exit Sub
      .Borders.LineStyle = IIf(.Value = "x", 1, -4142)
 End With
 End Sub
 (seiya)


ありがとうございます。マクロを動かすところまではできました。
私はシート1のリストボックス(入力規則で作った)で野球を選択したらA1:b2に
枠線を引いて中のセルを結合し中に文字を表示するということをしたいのですが
そこまではできないのでとりあえず同じシートに枠線を表示するところまでやってみたい
と思ってサンプルプログラムにif文をつけたのですが枠線が表示されませんでした。
なぜでしょうか。(if文をつけるまえのサンプルプログラム↓は正常に動きました。)
 
Sub Sample2()
 if E1="野球" then ←付け加えた!!
    With Range("A1:C3")
        .Borders(xlEdgeTop).LineStyle = xlContinuous
        .Borders(xlEdgeBottom).LineStyle = xlContinuous
        .Borders(xlEdgeRight).LineStyle = xlContinuous
        .Borders(xlEdgeLeft).LineStyle = xlContinuous
        .Borders(xlInsideVertical).LineStyle = xlContinuous
        .Borders(xlInsideHorizontal).LineStyle = xlContinuous
    End With
 endIF ←付け加えた。
End Sub

これでリストボックスで野球を選択すれば罫線が引かれるはずなんですが・・・


 投稿に際してはHNを記入してください。

 Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Address(0,0) <> "E1" Then Exit Sub
 If Target.Value = "野球" Then
      With Range("a:b2")
           .Merge
           .Borders.LineStyle = 1
      End With
 End If
 End Sub

 最終的に何をしたいのか不明なので....
 (seiya)

 >if文をつけるまえのサンプルプログラム↓は正常に動きました。
 
if E1="野球" then 
E1はセルを指定しているのではなくて、この場合は変数として認識されてしまいます。
つまり、Tさんは「セルE1」のつもりでも、プログラム上は「セルE1」ではなく、
変数のつもりではなくてもプログラム上は変数として書かれている、と言うことです。
 
Range("A1:C3")
はセル範囲A1:C3のことだ、とおおよそ分かっていらっしゃるようなので、
どのように書き直せばよいか、想像できると思います。
 
サンプルはあくまでサンプル。
どのように書けばどのように動くか、という例なので
「借りてきた本には載っていません」は当然かと。
(みやほりん)(-_∂)b

seiyaさん 最終的にやりたいのはシート1のA1からA2までにリストボックスを
つくって「記入する」「記入しない」を選択できるようにして「記入するなら」
シート2のセルのA1からB2のセルを枠線で囲み中のセルを統合し中央に「出勤」と記入
し「記入しない」なら線も引かずセルの統合も解除して中の文字も消すようなプログラムを作りたかったのですが・・・・

Private Sub Worksheet_Change(ByVal Target As Range)

 If Target.Address(0,0) <> "E1" Then Exit Sub
 If Target.Value = "野球" Then
      With Range("a:b2")
           .Merge
           .Borders.LineStyle = 1
      End With
 End If
 End Sub

↑せっかく書いてくれたのに実行できませんでした。(><)
alt F11でコード記入のやつをだして貼り付けて×で閉じてセルの画面に戻して
マクロの実行を押したのですが選択できるマクロがありませんでした。

>>サンプルはあくまでサンプル。
どのように書けばどのように動くか、という例なので
「借りてきた本には載っていません」は当然かと。

そのようですね・・・プログラムの道は険しいです。英語力のない人間には理解できないのかも・・・

(T)


 seiyaさんの作ってくださったコードは
 一行目に「Worksheet_Change」と書かれているように
 シートの内容が変わったときに、勝手に実行してくれます。
 コード内の「With Range("a:b2")」を「With Range("a2:b2")」
 に変更した後、E1に「野球」と入力してみてください。
 A2:B2が結合されて回りに罫線が引かれます。

 >シート1のA1からA2までにリストボックスをつくって
 言葉はあっていますかね?
 「リストボックス」と言うと
https://www.excel.studio-kazu.jp/tips/0601/
 この様なイメージで、言葉にすると
 『A1にリストボックスを作って、「記入する」「記入しない」
  を選択できるようにする』
 と言う物言いになると思いますが・・・・。
 それとも、A1セルとA2セルでは違う動きをさせるのでしょうか?

 2セル使って良いのなら、「マクロのボタンを2つ置いて於く」
 のでは駄目なのですかね?
 それなら、記録で出来そうです。

 (HANA)

すいません。E1にリストボックスを作って「記入する」「記入しない」を選択できるようにするの間違いでした。

一行目に「Worksheet_Change」と書かれているように
 シートの内容が変わったときに、勝手に実行してくれます。
なるほど!!seiyaさん頑張ってコード作ってくれてたんですね・・・意地でも完成させないと・・

けれどコードを標準モジュールにはってツール→マクロ→マクロを押したのですがマクロ名がなくて
実行できません。サンプルコードを貼ったときはマクロ名が出たのに・・・
(T)


さっきやってみたらうまくけました。みなさんありがとう!!(^^)
でもなんでリストボックスの中身を替えただけで線が引かれたんでしょうか?
マクロの実行をおしていなかったのに?マクロとVBAは同じではないんでしょうか。
だとすればどちらもプログラムを記入後→プログラムを実行をしないといけないはずなのに・・・

 HANAさん、いつもフォローをありがとうございます。

 "a:b2" いけませんでしたね...

 Tさん、
 「Macro」     : ある一定の条件化で、予め定められた処理をする。
 「VBAコード」 : 上記・又は処理を直接コードにしたもの。
 マクロの記録だけで処理できるものを「マクロ」、と言う方がいますが、
 そのような区別の仕方もあると思います。
 ですが、私は区別していません。

 マクロの起動には、ユーザーが起動するものとブックに変化が生じたときに
 その変化に応じて起動するものとがあります。

 今回の Worksheet_Change イベントコードは後者の一例です。
 >どのようなプログラムを....
 の質問の仕方から、ある程度VBAを理解していると判断し、詳しい貼り付け場所等は
 省きました。
 (seiya)


 私は次のように定義しています。
http://miyahorinn.fc2web.com/vbabegin/s_01_02.html
 
VBAはあくまで「マクロ」を実現するために用意された道具。
人間と人間がコミュニケーションをとるのには言語が必要で、
日本人同士のコミュニケーションには日本語が一般的です。
 
人間とExcelがコミュニケーションをとる(Excelに命令して仕事をさせる)には
VBAという言語が用意された、ということです。
 
(みやほりん)(-_∂)b

みやほりんさん SEIYAさんありがとうございます。マクロとvbaの違いがなんとなくわかりました。(^^)プログラムの方もSEIYAさんの作ってくれたものをみて本来作りたかったものに書き換えてみました。↓

Private Sub Worksheet_Change(ByVal Target As Range)

 If Target.Address(0, 0) <> "E3" Then Exit Sub  

 'Target.Address(0, 0) <> "E3"←この部分が謎。
 'セルの左上の座標のことかな?条件によってはEXIT SUBでプログラムを抜け出すみたいですね。

 If Target.Value = "表示" Then    'セルの値が表示するならば↓のプログラムを実行
      With Worksheets("Sheet1").Select  'シート1を選択
             Range ("G1:H2")       'G1:H2の範囲を選択
           .Merge           '.の前の何かが省略されている?Range("G1:H2")部分省略の予感
           .Borders.LineStyle = 1     '実線
           .Weight = xlThick       '太線
           .Value = "山田太郎"     '枠線のなかに山田太郎と表示

      End With
      End If

Else '表示する以外ならば↓を実行

     With Worksheets("Sheet1").Select
           Range ("G1:H2")
            .UnMerge           'セルの結合の解除
            .Borders.LineStyle = 1
            .Borders.Weight = xlThin   '細線
            .Value = False        '文字を消す

      End With
 End Sub

このプログラムは起動しませんでした。何か問題があるのでしょうか?
この問題さえクリアできれば仕事で役にたつ表ができそうです。(^^)
(T)


 With ステートメントのヘルプ。
/////////////////////
With object
[statements]
End With
/////////////////////
 
object の部分にはオブジェクトを取得するプロパティを記述します。Tさんが書いているのは
「Sheet1という名前のワークシートオブジェクトをSelectする」と言うメソッドです。
その後の
Range ("G1:H2")  
と言う一行もRangeオブジェクトを取得するプロパティを書いているだけで「選択する」という
メソッドではありません。
Withステートメントはたとえば、同じオブジェクトに対してメソッドやプロパティの設定が
連続してあるときに同じオブジェクトに対する重複した記述を簡易にするためのものです。
【例】
Worksheets("Sheet1").Range("G1:H2").Merge
Worksheets("Sheet1").Range("G1:H2").Value = "山田太郎"
Worksheets("Sheet1").Range("G1:H2").Borders.LineStyle = 1
Worksheets("Sheet1").Range("G1:H2").Borders.Weight = xlThick
↓
With Worksheets("Sheet1").Range("G1:H2")
    .Merge         '以下四行、.の前には本来、
    .Value = "山田太郎"   'Withで指定しているオブジェクトが来る。
    .Borders.LineStyle = 1
    .Borders.Weight = xlThick
End With
↓
With Worksheets("Sheet1").Range("G1:H2")
    .Merge
    .Value = "山田太郎"
    With .Borders    '同じRangeオブジェクトのBordersコレクションなので
        .LineStyle = 1   'さらにまとめることができる。
        .Weight = xlThick
    End With
End With
 
(みやほりん)(-_∂)b

 >If Target.Address(0,0) <> "E3" Then Exit Sub

 Private Sub Worksheet_Change(ByVal Target As Range)
      MsgBox Target.Address(0,0)
 End Sub

 上記コードを別のシートに貼り付けて、どこかのセルの値を変更する。

 ところで、Sheet1はそのコードが書かれているシート名?
 もしそうであれば、Sheets("Sheet1"). は不要です。
 それと、セルの値を変更する際に Change イベントが発生するので、
 余分な動きを制御するために、Application.EnableEvents = False/True
 を加えたほうが良いでしょう。
 (seiya)

すいません。これから出勤(地獄の夜勤)ですので明日拝見させて頂きます。

エクセルで作ったデータというシートに名前 表示する/表示しない 他等々の情報を入れてそのデータによってsheet1 sheet2などの名前の変更や表にある言葉を付け足すということをしたいのです。
(名前はsheet1やsheet2で =データ!D2だったかな?まあこういったものをいれてデータの方の変更で変わるようにしています。)
あとはデータにあるリストボックスの表示する/しないでshhet1やsheet2の表をセルを結合して太線で囲み文字を入れる、表示しないでセルの結合をといて枠を細線に戻して中の文字を消すという作業ができれば完成です。(あとはRange("G1:H2")やE3のところをrange("G3:H4") E4 等々に変えてコードを付け足していけばできあがり(^^)と考えています。
(T)


 「何をどうしたときに、何をどうする」
 をきちんと整理して、具体的・論理的に質問しなおしてください。
 (seiya)

質問しておきながら返事おくれました。すいません。

もう一度整理してから質問します。


コメント返信:

[ 一覧(最新更新順) ]


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