• 締切済み

excelマクロ subプロシージャに関して

excelでセルの色を変えるというものをコーディングしました。 選択したセルの隣のセルの値がそれぞれ、○だったら選択したセルの色を変えるプログラムです。 引数なしのため、ユーザー定義関数として定義することができず?、subプロシージャとして定義しているので、 シート内で全ての行に対応させることができず、実行するには一行ずつ、マクロの実行をさせなければ、このプロシージャを使えず、困っています。1行ずつでは作った意味がないので。。。 作ったプロシージャが手元にないので、明日アップしたいと思いますが、質問の意味がわかるかたいましたら、お願いします。

みんなの回答

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.2

#1です。 $ は固定を意味し、固定したい部分の前につけます。 $E1は、列は固定で行は相対、E$1は、列は相対で行は固定、$E$1は、列も行も固定 C1:I1 を選択した状態で =AND($E1="○",$F1="○",$G1="○",$H1="○",$I1="○") と入れた場合は全てのセルがE1~I1の状況を判断して書式を設定します。 それに対して、列を相対にして同じ事をすると C1 は =AND(E1="○",F1="○",G1="○",H1="○",I1="○") D1 は =AND(F1="○",G1="○",H1="○",I1="○",J1="○") E1 は =AND(G1="○",H1="○",I1="○",J1="○",K1="○")        ・        ・ のように判定対象が相対的にずれます。 AND関数は 全てが True の場合に True を返すので、C1は色が付いてもD1以降は色が付きません。 --- 条件付き書式で解決したようですが、VBAでも近い動作を書いて見ました。 これは標準モジュールではなく、シートモジュールに書きます。 シート名のタブを右クリックして「コードの表示」を押下し、出て来たVBE画面にコピペします。 該当シートのE:Hに○を入力すると黄色、Iにも○を入力すると水色になります。 試す場合は新規ブックでどうぞ。 Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Range, i As Integer, flg As Byte For Each r In Target  If Not Application.Intersect(r, Me.Columns("E:I")) Is Nothing Then    With r.EntireRow     flg = 1     For i = 5 To 8      If .Cells(1, i).Value <> "○" Then        flg = 0        Exit For      End If     Next i     If .Cells(1, 9).Value = "○" Then flg = flg + 2     Select Case flg      Case 1       .Cells(1, 3).Resize(1, 6).Interior.ColorIndex = 6       .Cells(1, 9).Interior.ColorIndex = xlNone      Case 3       .Cells(1, 3).Resize(1, 7).Interior.ColorIndex = 8      Case Else       .Cells(1, 3).Resize(1, 7).Interior.ColorIndex = xlNone     End Select   End With  End If Next r End Sub

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.1

セルの値が○ならば、隣のセルに色を付ける。 やりたい事がこれだけなら、マクロなど不要で条件付き書式で出来ます。 A列を全て選択した状態で、書式-条件付き書式で 数式が =(B1="○") としてセル色等を設定すれば、B列の値が「○」ならば左隣のA列セルに色が付きます。

boko18
質問者

お礼

お陰様で思い通りの条件付き書式が作成できました。 ありがとうございます。 ただ新たな疑問が生まれました。。。 まず、C~I列まで全て選択した状態で、 E1~I1まで全て○の場合、C1~I1までのセルの色を変える =AND($E1="○",$F1="○",$G1="○",$H1="○",$I1="○") の場合うまくいきましたが、 =AND(E1="○",F1="○",G1="○",H1="○",I1="○") の場合C1のセルのみ色が変わり、他のセルは元の色のままでした。 なんとなく、$をつけただけで、この意味がわかりませんでした。 相対参照、絶対参照の意味はわかるんですが。。。 なぜなんでしょうか?

boko18
質問者

補足

早速の回答ありがとうございます。 単一の色でなく、○の数によって、セルの色を変えたいのですが、 条件付き書式で可能なのでしょうか? 初めてで、こんな無駄に長いプログラムになってしまいました。。。 Sub セル色() With ActiveCell If .Offset(, -5).Value = "○" And .Offset(, -4).Value = "○" And .Offset(, -3).Value = "○" And .Offset(, -2).Value = "○" And .Offset(, -1).Value <> "○" Then Selection.Offset(0, -7).Select With Selection.Interior .ColorIndex = 6 .Pattern = xlSolid End With Selection.Offset(0, 1).Select With Selection.Interior .ColorIndex = 6 .Pattern = xlSolid End With Selection.Offset(0, 1).Select With Selection.Interior .ColorIndex = 6 .Pattern = xlSolid End With Selection.Offset(0, 1).Select With Selection.Interior .ColorIndex = 6 .Pattern = xlSolid End With Selection.Offset(0, 1).Select With Selection.Interior .ColorIndex = 6 .Pattern = xlSolid End With Selection.Offset(0, 1).Select With Selection.Interior .ColorIndex = 6 .Pattern = xlSolid End With ElseIf .Offset(, -5).Value = "○" And .Offset(, -4).Value = "○" And .Offset(, -3).Value = "○" And .Offset(, -2).Value = "○" And .Offset(, -1).Value = "○" Then Selection.Offset(0, -7).Select With Selection.Interior .ColorIndex = 8 .Pattern = xlSolid End With Selection.Offset(0, 1).Select With Selection.Interior .ColorIndex = 8 .Pattern = xlSolid End With Selection.Offset(0, 1).Select With Selection.Interior .ColorIndex = 8 .Pattern = xlSolid End With Selection.Offset(0, 1).Select With Selection.Interior .ColorIndex = 8 .Pattern = xlSolid End With Selection.Offset(0, 1).Select With Selection.Interior .ColorIndex = 8 .Pattern = xlSolid End With Selection.Offset(0, 1).Select With Selection.Interior .ColorIndex = 8 .Pattern = xlSolid End With Selection.Offset(0, 1).Select With Selection.Interior .ColorIndex = 8 .Pattern = xlSolid End With End If End With End Sub

関連するQ&A

  • マクロ subプロシージャーは指定できない?

    accessのマクロの アクション:プロシージャの実行 は、 subプロシージャーは指定できないのでしょうか? 標準モジュールに Sub test1() MsgBox "プロシージャーの実行のテストです" End Sub Function test2() MsgBox "プロシージャーの実行のテストです" End Function と作り、 マクロのプロシージャの実行で プロシージャ名をtest2()にすると、うまく表示されますが、 test1()だと、失敗します。 subプロシージャーをマクロで呼び出す方法を教えてください。

  • RunMacroメソッドではsubプロシージャーは呼び出せない?

    RunMacroメソッドはvbaのsubプロシージャーのマクロ1を呼び出すことはできないのでしょうか? DoCmd.RunMacro "マクロ1", 2 とするとエラーになってしまいます。 どうしても2回マクロを実行したい場合は Call マクロ1 Call マクロ1 とするしかないですか?

  • プロシージャが大きすぎます!

    Excel2000のVBAでフィルターオプションの連続操作をマクロで作成しているのですが、60回以上フィルターオプションを実行できるように記述したのですが、 長すぎてしまい、マクロを実行すると 「プロシージャが大きすぎます」と表示され実行できなくなります。ヘルプやHPを参考にして調べてみると、プロシージャを短くすればよいことはわかったのですが、SUBでプロシージャを短くし、その後、そのSUBで区切ったものを連続実行するためにはどのようにすればよいのでしょうか? VBAを勉強したばかりで、見当違いの質問かもしれませんが、補足いたしますので、よろしくお願いいたします。

  • マクロ

    宜しくお願いいたします セルを選択するマクロですが、何処か間違っているので 実行すると、K25のみ選択されてしまいます 一行おきに選択したいのですが 以下のマクロです Sub セルの選択2() Dim ColPos As Integer Dim RowPos As Integer For ColPos = 1 To 11 Step 2 For RowPos = 5 To 25 Step 2 Cells(RowPos, ColPos).Select Next Next End Sub

  • エクセルのマクロ

    Sub test() x = Selection.Row y = Selection.Column z = Selection.Columns.count Range(Cells(x, y), Cells(x, y + z - 2)).Select Selection.ClearContents End Sub 上記マクロは、同一行の連続するセルを二つ以上選択状態にして実行すると、範囲内の最も右にあるセルの値のみが残って他のセルの値は全て消去されます。 上記マクロを、複数のセレクションに対して対応できるようにするには、どうすればいいでしょうか? 例えば、c1~f1、d3~h3、e10~g10を選択して実行すると、f1とh3とg10の値のみ残って他の値は消えるということです。

  • セルから呼び出したプロシージャ内でセルの塗りつぶし

    初めて質問させていただきます 宜しくお願い致します セルから呼び出したプロシージャ内からセルの塗りつぶしを 実行しても塗りつぶしが有効になりません たとえば A1のセルに10を入力 B1のセルに=TEST(A1) と入力 マクロのモジュール内に Public Function TEST(tmp_No As Integer) As Integer TEST = tmp_No * 25 '(1)ここから If TEST = 250 Then    'Msgbox "チェック用MSG"    Cells(1, 1).Interior.ColorIndex = 38 End If '(2)ここまで End Function というファンクションプロシージャがあるとします 引数で10を持って行ってるので10×25で TESTが250になりB1には計算結果として 250と問題なく表示されています しかし (1)~(2)のセルの塗りつぶしは実行されません 仮にチェック用のメッセージボックスのコメント を外すとキチンとメッセージボックスは 表示されます また、塗りつぶしダケのマクロを作成し Public Sub cell_paint()    Cells(1, 1).Interior.ColorIndex = 38 End Sub 実行すると、これも問題なく動作しますので EXCELの設定ではないと判断しています セルから呼び出したプロシージャの時 だけ、動作しないようなのですが なぜでしょうか? 他の方法で回避可能でしょうか? ※実際には塗りつぶしの判定方法が  20個あり、条件付書式では対応出来ないので  マクロで処理を試みてます 宜しくお願い致します

  • エクセルのマクロですが

    現在選択しているセルから10行下のセルまでを選択状態にするマクロを知りたいのですが。 (現在A5を選択している時に実行すると、A5からA15までが選択状態になります) よろしくお願いします。

  • エクセルVBA イベントプロシージャに引数を渡せま

    お世話になります。 エクセル2003/XP 使用です。 イベントプロシージャに引数を渡せまるかどうか教えていただけますでしょうか? 下記のコード中の変数mysheetnameを ユーザーフォーム、→ CommandButton1のプロシージャに 引数として渡して行きたいのですが、 実行すると、一番最初のWorkbook_SheetBeforeRightClickの時点で、 コンパイルエラー:  プロシージャの宣言が、イベントまたはプロシージャの定義と一致していません。 とエラー表示されます。 イベントプロシージャに引数を渡すことはできますでしょうか? ---------- ThisWorkBook内 ---------- Public mysheetname As String Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) mysheetname = ActiveSheet.Name UserForm1.Show (mysheetname)     '←変数mysheetnameの値をユーザーフォームに渡したい。 End Sub ---------- ユーザーフォーム ---------- Private Sub UserForm_Initialize(ByVal mysheetname As String ) 処理 End Sub Private Sub CommandButton1_Click(ByVal mysheetname As String ) 処理 End Sub ’--------- ここまで 引数について少し理解し始めたばかりの者です。 よろしくお願いします。

  • Excel VBA で 一括書式設定(セル内の一部のみ)

    こんにちは。教えてください。 1つのセル内に、 あいうえお1か き! くけこ2 さしすせそ3たち。 つてと45.67? というように、いくつかのセル内改行を含み、文字数がばらばらのデータが入っています。そういうセルが、一行にいくつも並んでいます(途中に空白もあります)。 それらの1行目(上記の例で言うと、「あいうえお1か」)のみ、フォント赤色の書式設定を、マクロで行いたいのです。 そこで、以下のマクロを実行すると、選択セルがひとつだけのときは問題ないのですが、複数のセルを選択すると実行時エラー(型が一致しません)が出てしまいます。 Sub 一行目赤() With Selection.Characters(Start:=1, Length:=InStr(Selection.Value, Chr(10)) - 1).Font .ColorIndex = 3 End With End Sub 選択セルのすべてに対し、一括で書式設定できるようにするにはどうしたらよいでしょうか?ご回答よろしくお願いいたします。

  • エクセルVBA:プロシージャーの実行条件

    選択した範囲の中に、"#N/A"という文字列が一つもなければ選択範囲をcopy→value pasteというマクロを作りたいのですがどのようにすればいいでしょう? ユーザー定義関数で別のデータソースから数値を引っ張ってきた後value pasteしたいのですが、数値を引っ張ってくるのに結構時間がかかる為、数値を引っ張ってくるプロシージャーの後でvalue pasteするプロシージャーを続けて実行すると、数値を引っ張れていないセルは"#N/A"をcopyしてそのままpasteしてしまいます(データが来ていないセルは"#N/A"が表示されているので)。 宜しくお願いします。

専門家に質問してみよう