[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『エクセルVBAで罫線を引き文字を表示する。』(T)
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)
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
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)
一行目に「Worksheet_Change」と書かれているように
シートの内容が変わったときに、勝手に実行してくれます。 なるほど!!seiyaさん頑張ってコード作ってくれてたんですね・・・意地でも完成させないと・・
けれどコードを標準モジュールにはってツール→マクロ→マクロを押したのですがマクロ名がなくて
実行できません。サンプルコードを貼ったときはマクロ名が出たのに・・・
(T)
HANAさん、いつもフォローをありがとうございます。
"a:b2" いけませんでしたね...
Tさん、 「Macro」 : ある一定の条件化で、予め定められた処理をする。 「VBAコード」 : 上記・又は処理を直接コードにしたもの。 マクロの記録だけで処理できるものを「マクロ」、と言う方がいますが、 そのような区別の仕方もあると思います。 ですが、私は区別していません。
マクロの起動には、ユーザーが起動するものとブックに変化が生じたときに その変化に応じて起動するものとがあります。
今回の Worksheet_Change イベントコードは後者の一例です。 >どのようなプログラムを.... の質問の仕方から、ある程度VBAを理解していると判断し、詳しい貼り付け場所等は 省きました。 (seiya)
私は次のように定義しています。 http://miyahorinn.fc2web.com/vbabegin/s_01_02.html VBAはあくまで「マクロ」を実現するために用意された道具。 人間と人間がコミュニケーションをとるのには言語が必要で、 日本人同士のコミュニケーションには日本語が一般的です。 人間とExcelがコミュニケーションをとる(Excelに命令して仕事をさせる)には VBAという言語が用意された、ということです。 (みやほりん)(-_∂)b
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.