• ベストアンサー

範囲を指定した中で検索し、その列を指定するVBA

エクセルVBAのことで伺います。 3行目のD列からBC列の中で、出発地、又は到着地と入力されたセルを探し、 そのセルの含まれる列を指定し、当該マクロを作動させたいと思っているの ですが、 If Intersect(Target, Range("D3:BC3"),Find("出発地")or("到着地").Column) と書いても、構文エラーと表示されてしまいます。 どう書けば良いのか、どなたかご教授願います。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.7

何度もごめんなさい。 前回の変更したコードでも無駄なループをしていましたので、 もう一度考え直してみました。 今までのコードはすべて削除して↓のコードに変更してみてください。 Private Sub Worksheet_Change(ByVal Target As Range) Dim j As Long, r As Range, myRng As Range, Foundcell As Range 'とりあえず 出発日があるかどうか念のため確認 Set myRng = Rows(3).Find(what:="出発日", LookIn:=xlValues, lookat:=xlWhole) 'もし「出発日」があれば If Not myRng Is Nothing Then '1列目~3行目の最終列までループ For j = 1 To Cells(3, Columns.Count).End(xlToLeft).Column 'ループさせているセルが「出発日」もしくは「到着日」であれば If Cells(3, j) = "出発日" Or Cells(3, j) = "到着日" Then '出発日、到着日のすべてのセルを「myRng」に格納 Set myRng = Union(myRng, Cells(3, j)) End If Next j End If With Target '変化したセルの・・・ 'セル番地(Targetの列の3行目)がmyRngにない場合は何もしない If Intersect(Cells(3, .Column), myRng) Is Nothing Then Exit Sub '★↓からは今までの処理 Set Foundcell = Range("D3:Q3").Find("年").Offset(0, -1) If IsDate(.Value) Then If Year(.Value) <> Foundcell Then Application.EnableEvents = False .Value = DateSerial(Foundcell, Month(.Value), Day(.Value)) Application.EnableEvents = True End If End If End With End Sub ※ 若干コードが短くなったと思います。m(_ _)m

qazxcvfr4
質問者

お礼

親切にいろいろと教えていただき、ありがとうございます。 記述もおかげさまで理解できましたし、上記のコードで動かしてみると、 私の望んでいるとおりに動いてくれました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (6)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.6

どうもごめんなさい。 >、「c As Range」と定義していますが、その後の記述にcは出てこないのですが、 >どういった意味があるのでしょうか 最初 myRngに 出発日・到着日 のセルを格納しようと思い、あのような宣言をしました。 実際は > For j = 1 To Cells(3, Columns.Count).End(xlToLeft).Column で各列をループさせて「出発日」「到着日」のセルを格納していますので、 ご指摘通り変数「c」の宣言は不要でしたし、まったく使用していません。 どうも失礼しました。 ※ rが列番号だと、どこで認識させているのでしょうか の件について、 少し長くなりますが >Set myRng = Union(myRng, Cells(3, j)) '←「出発日」「到着日」のすべてのセルを myRng に格納しています。 >For Each r In myRng でとりあえず r を myRng の範囲をループさせています。 >If r.Column = .Column Then >myFlg = True >Exit For >End If の4行で r の列番号が .Column(←Targetの列)と一致すれば「myFlg」を「TRUE」にしループから抜けています。 (.Column の「.」は With Target とつながっていますので、 Target.Column というコトになります) 次の >If myFlg = True Then myFlg が「TRUE」の時(Target.Columnが「出発日」「到着日」の列と一致する場合←ココでChangeイベントを実行するかどうか判断します) (myFlg は 「ブール型」で宣言していますので、「TRUE」か「FALSE」の2バイトの変数です。初期値は「FALSE」) >If .Column = r.Column Then の行は本来は不要でした。 (myFlg が「TRUE」の場合は必ず Target.Column が myRng の列番号のいずれかになるので・・・ ) 以上のコトを考慮し、コメントも一緒に記載してもう一度コードを訂正してみます。 Private Sub Worksheet_Change(ByVal Target As Range) Dim j As Long, r As Range, myRng As Range, Foundcell As Range, myFlg As Boolean 'とりあえず 出発日があるかどうか念のため確認 Set myRng = Rows(3).Find(what:="出発日", LookIn:=xlValues, lookat:=xlWhole) 'もし「出発日」があれば If Not myRng Is Nothing Then '1列目~3行目の最終列までループ For j = 1 To Cells(3, Columns.Count).End(xlToLeft).Column 'ループさせているセルが「出発日」もしくは「到着日」であれば If Cells(3, j) = "出発日" Or Cells(3, j) = "到着日" Then 'myRng にそのセルを格納 Set myRng = Union(myRng, Cells(3, j)) '←出発日、到着日のすべてのセルを「myRng」に格納 End If Next j End If '変化したセルの・・・ With Target 'r は myRng 内をループ For Each r In myRng 'r の列番号が変化したセルの列番号と同じなら If r.Column = .Column Then 'myFlg を「TRUE」にし、ループから抜ける myFlg = True Exit For End If Next r 'myFlg が「TRUE」なら(変化セルがmyRngの列番号であれば) If myFlg = True Then '★↓からは以前のコード Set Foundcell = Range("D3:Q3").Find("年").Offset(0, -1) If IsDate(.Value) Then If Year(.Value) <> Foundcell Then Application.EnableEvents = False .Value = DateSerial(Foundcell, Month(.Value), Day(.Value)) Application.EnableEvents = True End If End If End If End With End Sub ※ 長々と書きましたがこの程度でどうでしょうか?m(_ _)m

qazxcvfr4
質問者

お礼

何度もありがとうございます。 大変、わかりやすく丁寧な説明をしていただき、ようやく理解することができました。

全文を見る
すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.5

続けてお邪魔します。 >Findnextを使う必要があるようなのですが・・・ 他の方法でやってみました。 少々回りくどくなりますが、 Private Sub Worksheet_Change(ByVal Target As Range) Dim j As Long, c As Range, r As Range, myRng As Range, Foundcell As Range, myFlg As Boolean Set myRng = Rows(3).Find(what:="出発日", LookIn:=xlValues, lookat:=xlWhole) If Not myRng Is Nothing Then For j = 1 To Cells(3, Columns.Count).End(xlToLeft).Column If Cells(3, j) = "出発日" Or Cells(3, j) = "到着日" Then Set myRng = Union(myRng, Cells(3, j)) '←出発日、到着日のすべてのセルを「myRng」に格納 End If Next j End If With Target For Each r In myRng If r.Column = .Column Then myFlg = True Exit For End If Next r If myFlg = True Then If .Column = r.Column Then Set Foundcell = Range("D3:Q3").Find("年").Offset(0, -1) If IsDate(.Value) Then If Year(.Value) <> Foundcell Then Application.EnableEvents = False .Value = DateSerial(Foundcell, Month(.Value), Day(.Value)) Application.EnableEvents = True End If End If End If End If End With End Sub こんな感じではどうでしょうか? ※ とりあえず「出発日」という項目が3行目に必ずあるという前提です。m(_ _)m

qazxcvfr4
質問者

お礼

お礼が遅くなって申し訳ありません。 全体的にわからずに、手こずっておりました。 ようやくわからないところがわかってきた感じなのですが、伺ってもよろしいでしょうか。 まず、「c As Range」と定義していますが、その後の記述にcは出てこないのですが、 どういった意味があるのでしょうか。 また、以下の部分がよくわかりませんでした。 rが列番号だと、どこで認識させているのでしょうか。 また、最初の「myFlg = True」ではifがついていないのに、2回目では 「If myFlg = True Then」とifがついているのは、どういったことなのでしょうか。 With Target For Each r In myRng If r.Column = .Column Then myFlg = True Exit For End If Next r If myFlg = True Then If .Column = r.Column Then

全文を見る
すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

No.2・3です。 >3行目の値が出発日、又は到着日の列全体」というようにしたいと思っております。 というコトですので、↓のようなコードではどうですか? Private Sub Worksheet_Change(ByVal Target As Range) Dim FoundCell As Range, c As Range, r As Range Set FoundCell = Range("D3:Q3").Find("年").Offset(0, -1) Set c = Rows(3).Find(what:="出発日", LookIn:=xlValues, lookat:=xlWhole) Set r = Rows(3).Find(what:="到着日", LookIn:=xlValues, lookat:=xlWhole) With Target If .Column = c.Column Or .Column = r.Column Then If IsDate(.Value) Then If Year(.Value) <> FoundCell Then Application.EnableEvents = False .Value = DateSerial(FoundCell, Month(.Value), Day(.Value)) Application.EnableEvents = True End If End If End If End With End Sub ※ いままでの流れと質問文から解釈するとこういう感じだと判断しました。m(_ _)m

qazxcvfr4
質問者

お礼

毎度、教えていただき、感謝いたします。 小生、昨日まで職場にいなかったため、本日、ようやく試すことができました。 書いたいただいたとおりなんですが、出発日、到着日と入ったセルが3行目に2つずつあるため、 A列から見て最初の「出発日」「到着日」の列にしか作用しません。 Findnextを使う必要があるようなのですが、それをどう使って修正すれば良いのか教えていただけ ないでしょうか。 よろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

No.2です。 >出発地、到着地、と入った列のみならず、シート全体において、このマクロが動いてしまっています。 おそらく↓のURLの続きだと思いますので、 http://okwave.jp/qa/q8750441.html 変数の宣言のすぐ後に↓のコードを追加してみてはどうでしょうか? If Intersect(Target, Range("G4:I100")) Is Nothing Or Target.Count > 1 Then Exit Sub 尚、途中にある >If Target.Count <> 1 Then Exit Sub の行はダブりますので不要になります。m(_ _)m

qazxcvfr4
質問者

お礼

ありがとうございます。 しかし、申し訳ないのですが、追加すると動くようにはなったものの、追加した 「Dim myCol As Long For myCol = 4 To 55 If Cells(4, myCol) = "出発日" Or Cells(4, myCol) = "到着日" Then Exit For Next myCol」 の部分が意味をなさないように思います。 列の挿入、削除があっても対象とする列がずれないよう、現在は「G4:N100」とマクロの対象範囲を書いているところを、「3行目の値が出発日、又は到着日の列全体」というようにしたいと思っております。 Private Sub Worksheet_Change(ByVal Target As Range) Dim FoundCell As Range Set FoundCell = Range("D3:Q3").Find("年").Offset(0, -1) Dim myCol As Long For myCol = 4 To 55 If Cells(3, myCol) = "出発日" Or Cells(3, myCol) = "到着日" Then Exit For Next myCol With Target If Intersect(Target, Range("G4:N100")) Is Nothing Or Target.Count > 1 Then Exit Sub If IsDate(.Value) Then If Year(.Value) <> FoundCell Then Application.EnableEvents = False .Value = DateSerial(FoundCell, Month(.Value), Day(.Value)) Application.EnableEvents = True End If End If End With End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんにちは! Findメソッドは OR条件での検索はできないと思います。 そこで一例です。 当然 出発地・到着地 は存在するという前提です。 Sub Sample1() Dim myCol As Long For myCol = 4 To 55 'D列~BC列まで If Cells(3, myCol) = "出発地" Or Cells(3, myCol) = "到着地" Then Exit For Next myCol End Sub または Sub Sample2() Dim c As Range, r As Range, myCol As Long Set c = Range("D3:BC3").Find(what:="出発地", LookIn:=xlValues, lookat:=xlWhole) Set r = Range("D3:BC3").Find(what:="到着地", LookIn:=xlValues, lookat:=xlWhole) myCol = WorksheetFunction.Min(c.Column, r.Column) End Sub で 変数myCol に出発地・到着地 のどちらかが、最初に出現した列番号が格納されます。 ※ Sample2の方は両方が範囲内に存在しないとエラーになります。m(_ _)m

qazxcvfr4
質問者

お礼

毎度、お世話になり感謝しております。 実は、昨日教えていただいたマクロと同じ件でして、「D3からQ3までのセルの中で「年」と入ったセルの左横のセルを探し、その中の値(西暦の年が入っています)を、3行目の中で「出発地」「到着地」と入った列に入力する月日の年として置き換える」といった操作をしたいと思っております。 もともと、だいぶ前にtom04さんに教えていただいたプロシージャを一部変更したものが以下のものになりますが、これで問題ないのでしょうか。「If Intersect(Target, Range("G4:I100”,”L4:BC100)) Is Nothing Or Target.Count」」の部分をなくし、 「Dim myCol As Long For myCol = 4 To 55 If Cells(3, myCol) = "出発地" Or Cells(3, myCol) = "到着地" Then Exit For Next myCol」 を加えました。 このお礼を書いてる途中で変更し、実際に動かしてみると問題なさそうなんですが、これで問題ないのでしょうか。 Private Sub Worksheet_Change(ByVal Target As Range) Dim FoundCell As Range Set FoundCell = Range("D3:Q3").Find("年").Offset(0, -1) Dim myCol As Long For myCol = 4 To 55 If Cells(3, myCol) = "出発地" Or Cells(3, myCol) = "到着地" Then Exit For Next myCol With Target If Target.Count <> 1 Then Exit Sub If IsDate(.Value) Then If Year(.Value) <> FoundCell Then Application.EnableEvents = False .Value = DateSerial(FoundCell, Month(.Value), Day(.Value)) Application.EnableEvents = True End If End If End With End Sub

qazxcvfr4
質問者

補足

すみません。 うまく動いていませんでした。 出発地、到着地、と入った列のみならず、シート全体において、このマクロが動いてしまっています。

全文を見る
すると、全ての回答が全文表示されます。
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

Intersectの構文と全く異なっていますので具体的に何をしたいのかが良く解りませんが、該当するセルの列番号を取得したいのでしたら以下の様なコードで如何でしょう。 配列nCol()に該当セルの列番号を順番に入れていきます。 Sub Sample()   Dim rOne As Range   Dim nCol() As Variant '該当セルの列No.が入る   Dim nCount As Integer   nCount = 0   For Each rOne In Range("D3:BC3")     If (rOne = "出発地") Or (rOne = "到着地") Then       ReDim Preserve nCol(nCount)       nCol(nCount) = rOne.Column       nCount = nCount + 1     End If   Next rOne   '----------配列に入れるのはここまで      If nCount = 0 Then     MsgBox ("該当セルなし")     Exit Sub   End If   For i = 0 To UBound(nCol())     MsgBox ((i + 1) & "番目:" & nCol(i) & "列")   Next i End Sub

qazxcvfr4
質問者

お礼

細かい説明まで書いていただき、ありがとうございます。 しかし、申し訳ないのですが、列番号を知りたいのではなく、「D3からQ3までのセルの中で「年」と入ったセルの左横のセルを探し、その中の値(西暦の年が入っています)を、3行目の中で「出発地」「到着地」と入った列に入力する月日の年として置き換える」といった操作をしたいと思っております。 現状では以下のように書いてあり、5行目の「Range("G4:I100”,”L4:BC100)」のところを、どう書きかえれば良いかというところでつまづいております。 Private Sub Worksheet_Change(ByVal Target As Range) Dim FoundCell As Range Set FoundCell = Range("D3:Q3").Find("年").Offset(0, -1) With Target If Intersect(Target, Range("G4:I100”,”L4:BC100)) Is Nothing Or Target.Count <> 1 Then Exit Sub If IsDate(.Value) Then If Year(.Value) <> FoundCell Then Application.EnableEvents = False .Value = DateSerial(FoundCell, Month(.Value), Day(.Value)) Application.EnableEvents = True End If End If End With End Sub

qazxcvfr4
質問者

補足

すみません。 できたかもしれません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBA Intersectで範囲の記述

    エクセル2000です。 Intersectで範囲の記述で、名前が定義された範囲、myRng と その2列右どなりを指定したいのですが、 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Union(Range("myRng"), Range("myRng").Offset(, 2))) Is Nothing Then Exit Sub MsgBox Target.Address End Sub のようにUnionを使わなければできないでしょうか? myRngがA1:A10であれば、 If Intersect(Target, Range("A1:A10,C1:C10")) Is Nothing Then Exit Sub と簡単に記述できるのですが。

  • 結合されたセルを列方向に検索したい

    excel2003 結合されたセルを列方向に検索したい Bセルで同じ文字列が入っているセルをダブルクリックすると、順繰りに検索する。 下記が、マクロの内容です。 ------------------------------------------------------------------------- Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) On Err GoTo Myerr: Dim MyRange As Range Dim FirstRow As Integer Application.EnableEvents = False If Target.Column = 2 And Target.Value <> "" Then If Target.Row = Range("B" & Rows.Count).End(xlUp).Row Then FirstRow = 1 Else FirstRow = Target.Row End If With Range("B" & FirstRow & ":B" & Range("B" & Rows.Count).End(xlUp).Row) Set MyRange = .Find(Target.Value, LookIn:=xlValues, After:=ActiveCell) If FirstRow = Target.Row Then Set MyRange = Range("B1:B" & Range("B" & Rows.Count).End(xlUp).Row).Find(Target.Value, LookIn:=xlValues, After:=ActiveCell) MyRange.Select Else MyRange.Select End If End With End If Application.EnableEvents = True Myerr: Application.EnableEvents = True End Sub ------------------------------------------------------------------------- 上記内容で、単独セルであれば動作するのですが、 行方向に結合されている(B1とB2が結合されている)セルをダブルクリックすると 実行時エラー’13’: 型が一致しません。 というエラーが発生します。 上記マクロでどこを修正したらよいのか、教えていただきたく。 B列は、結合されたセル、単独のセルが混在しています。

  • VBA 範囲選択時エラー

    Private Sub Worksheet_SelectionChangeのVBAでA列B列C列でワンクリックで文字が入力できるように設定致しました。 その後、A列からC列を範囲選択してDeleteするとデバック 「実行時エラー  型が一致しません」と出てしまいます。業務上、そのセルのデータは一気に消したいので困っております。どなたか分かる方よろしくお願い致します。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim rng As Range, rng_1 As Range, rng_2 As Range Application.EnableEvents = False Set rng_1 = Range("H17:H100") Set rng_2 = Range("I17:I100") Set rng_3 = Range("J17:J100") Set rng_4 = Range("K17:K100") Application.EnableEvents = True Set rng = Intersect(Target, rng_1) If Not rng Is Nothing Then Cancel = True If Target.Value = "" Then Target.Value = "(1)" Else Target.Value = "(1)" End If Else Set rng = Intersect(Target, rng_2) If Not rng Is Nothing Then Cancel = True If Target.Value = "(2)" Then Target.Value = Empty Else Target.Value = "(2)" End If Else Set rng = Intersect(Target, rng_3) If Not rng Is Nothing Then Cancel = True If Target.Value = "(3)" Then Target.Value = Empty Else Target.Value = "(3)" End If Else Set rng = Intersect(Target, rng_4) If Not rng Is Nothing Then Cancel = True If Target.Value = "(4)" Then Target.Value = Empty Else Target.Value = "(4)" End If End If End If End If End If End Sub

  • 別の列のデータを検索してセルの色を変える

    Private Sub Worksheet_Change(ByVal Target As Range) If (Target.Column <> 1) And (Target.Column <> 5) Then Exit Sub If Not IsNumeric(Target.Value) Then Exit Sub Target.Offset(0, 1).Value = Now() End Sub 上記のスクリプトで 「1列目にナンバーを記入すると2列目に、5列目にナンバーを記入すると6列目に時刻が自動的にセルに入る」ようになっています。 これに追加で 「5列目にナンバーが記入されると、そのナンバーと同じものを1列目から探し出して、1列目のセルの色を薄い青にする。なければなしとアラートを出す」 ように改造したいのですが どうすればいいでしょうか? どうかお願いいたします。

  • Excel VBA セルの値を変更後にVBA作動

    Excel VBAを活用して、特定のセルの値が変更されたときに、VBA処理を発動させることになりました。 処理といたしましては、C列(3列目)の4行目以下の空白セルに数値を入力するか、セルに入力されている数値を変更した場合にVBAを発動させたいです。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Column = 3 And Target.Row >= 4 Then MsgBox "セルの値が更新されました" End If End Sub 上記のコードを実行してみたところ、3列目(C列)の4行目を選択した段階でVBAが作動してしまいます。 セルの値変更後に作動するようにするには、どう修正すればよろしいでしょうか?

  • エクセルVBA プルダウンのリスト 指定範囲以外で

    こんにちは。 現在、業務で案件の簡単な進捗表を作成しています。 VBAで他の、ご質問/回答を基にマクロを組んで遊んで?いますが、 以下の問題に困っています。 現在作成中のエクセルファイルのステータスですが、 (1)A列に”入力規則”でプルダウン(終了,延期)を設けています。 (2)マクロでA列のプルダウンで”終了”の場合はA:AFまでグレーアウト  同様に”延期”の場合はA:AFまで黄色 (3)マクロでC列に”土”ならフォントを青で日なら赤 やりたい事ですが、 (1)の事を”マクロ”でやりたいんです。 リストで元の値を指定してマクロを組む方法は、 いくらでもネット上に転がっているのですが、 元の値を範囲ではない方法、つまり、 入力規則⇒リスト⇒ ”=$A$1:$A$10” ではなく、”りんご,ばなな、みかん”のように、 マクロのコード内で範囲を構成したい、、、 うまくいえませんが、簡単に言うと、プルダウンメニューが2つしかないのに、 わざわざ、データ用の別シートを作ったりしたくない、、、という理由です。 このプルダウンメニューのマクロを今の下記コードに組み込ませたいのですが、 どなたか、ご教授願います。 ※今後の事も考え拡張性(プルダウンメニューの追加とか)を考慮したものを書きたいです。 マクロが面白くなってきたから勉強しているのであって、 入力規則の今のままでいいのでは?という野暮な回答はご遠慮します。 上記の(2)と(3)を他の質問から見よう見まねで組み合わせ、 動作は確認出来ています。 以下が組み合わせたものとなります。 Private Sub Worksheet_Change(ByVal Target As Range) Dim RngA1 As Range Dim RngA2 As Range Dim RngC1 As Range Dim RngC2 As Range Dim RngE1 As Range Dim RngE2 As Range Dim rr As Range Dim i As Long Dim c As Range Dim myColor As Long Dim clr As Integer '#########################Aの処理######################### Set RngA1 = Range("A:A") '判定の対象となる列 Set RngA2 = Range("A:AF") '色を変える列 If Intersect(Target, RngA1) Is Nothing Then GoTo SYORI_C For Each c In Intersect(Target, RngA1) With c Select Case .Value Case "終了": myColor = 48 Case "延期": myColor = 27 Case Else myColor = xlColorIndexNone End Select Intersect(c.EntireRow, RngA2).Interior.ColorIndex = myColor End With Next '#########################Cの処理######################### SYORI_C: Set RngC1 = Range("V:V") '判定の対象となる列 Set RngC2 = Range("V:W") '色を変える列 If Intersect(Target, RngC1) Is Nothing Then GoTo SYORI_E For Each c In Intersect(Target, RngC1) With c Select Case .Value Case "無し": myColor = 48 Case Else myColor = xlColorIndexNone End Select Intersect(c.EntireRow, RngC2).Interior.ColorIndex = myColor End With Next '#########################Eの処理######################### SYORI_E: Set RngE1 = Range("X:X") '判定の対象となる列 Set RngE2 = Range("X:Y") '色を変える列 If Intersect(Target, RngE1) Is Nothing Then GoTo SYORI_G For Each c In Intersect(Target, RngE1) With c Select Case .Value Case "無し": myColor = 48 Case Else myColor = xlColorIndexNone End Select Intersect(c.EntireRow, RngE2).Interior.ColorIndex = myColor End With Next '######################################################## SYORI_G: If Intersect(Target, Range("C:C")) Is Nothing Then Exit Sub For Each rr In Intersect(Target, Range("C:C")) For i = 1 To Len(rr.Value) Select Case Mid$(rr.Value, i, 1) Case "土": clr = 5 Case "日": clr = 3 Case Else: clr = xlAutomatic End Select rr.Characters(i, 1).Font.ColorIndex = clr Next Next '######################################################## End Sub

  • エクセル VBA で列番号を足す方法は?

    こんにちは。大変お世話になっています。 Set btd = Range("d2:z2").Find(bmd) といったVBAを使用し、あるセル番地を抜き出しました。 そのセルの列番号のみを抜き出して、そこから列番号を右へいくつか動かしたいのですが、その方法がわかりません。 別の定義で出した行をgとして Cells(g, btd.Column)でセルの指定をしました。 このセルがa1だとします。 次の作業として、b1のセルを指定したいのですが、その方法がわからないのです。 b=Cells(g, btd.Column) と定義して、 b.Offset(0, 1).Value などと書いてもエラーになってしまいます。 行番号なら数字を足したり引いたりすればできたのですが、アルファベットの列番号の場合はどうしたら良いのでしょうか? すみませんがよろしくお願いします。

  • VBAで別の列のセルにも色付け~2

    WINDOWS XP EXCELL 2003です。 いつもお世話になります。 ご迷惑とは重々と承知しながら再度質問させていただきます。 1 御指導を賜りたいのは、 現在A列には月度を示す 01~12 が入力され月別にセルの背景色を塗りつぶしていますがこれをA列用のマクロを工夫してF列にも同様に適用したい。 例えば参照図で言うと A7 05 ピンク  A8 05 ピンク A9 06 ライトブルー  A10 07 草色 等のように ※ 参照図のF列のセルには背景色は適用していません。 2 参照図のそれぞれの設定は、   ※ 計画 と 生産はセル位置だけの違いで生産の方は割愛します。 D1 ユーザー定義 mm/dd D2 ユーザー定義 200000 D3 数値 A7 ユーザー定義 mm マクロ ボタン「計画入力」 Sub 計画入力() Dim GYOU '追加 GYOU = Range("C65536").End(xlUp).Row + 1 Cells(GYOU, 2).Value = Range("D1").Value Cells(GYOU, 3).Value = Range("D2").Value Cells(GYOU, 4).Value = Range("D3").Value End Sub ボタン「セルセット」 Sub 計画セル()    Range("D1,D2,D3,D1").Select End Sub A列のセル塗りつぶし Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row >= 8 And Target.Address = Cells(Rows.Count, "C").End(xlUp).Address Then Target.Offset(0, 0).Value = Date End If Dim c As Integer If Target.Column <> 2 Then Exit Sub If Target.Value = "" Then c = 0 Else On Error GoTo line Select Case Month(Target.Value) Case 1: c = 46 Case 2: c = 4 Case 3: c = 39 Case 4: c = 6 Case 5: c = 7 Case 6: c = 8 Case 7: c = 43 Case 8: c = 3 Case 9: c = 44 Case 10: c = 24 Case 11: c = 40 Case 12: c = 17 End Select End If Target.Offset(0, -1).Interior.ColorIndex = c Target.Offset(0, -1).Font.ColorIndex = IIf(c = 1, 2, 0) Exit Sub line: Target.Offset(0, -1).Interior.ColorIndex = 0 Target.Offset(0, -1).Font.ColorIndex = 0 End Sub 御指導よろしく御願いします。

  • Find,Offsetを使ってセルを指定する方法

    エクセルVBAのことで伺います。 以下の記述は、「D3からQ3までのセルの中で「年」と入ったセルの左横のセルを探し、 その中の値(西暦の年が入っています)を、G4からI100までの範囲に入力される月日 の年として置き換える」といったものなのですが、エラーが出てしまいます。 「実行時エラー424、オブジェクトが必要です。」とのメッセージが表示され、デバックを クリックすると、「Set FoundCell = Range("D3:Q3").Find("年").Offset(0, -1).Select」 が黄色く強調表示されています。 プログラムの記述をどのように修正すれば良いか、どなたかお教えください。 よろしくお願いいたします。 Private Sub Worksheet_Change(ByVal Target As Range) Dim FoundCell As Range Set FoundCell = Range("D3:Q3").Find("年").Offset(0, -1).Select With Target If Intersect(Target, Range("G4:I100)) Is Nothing Or Target.Count <> 1 Then Exit Sub If IsDate(.Value) Then If Year(.Value) <> FoundCell Then Application.EnableEvents = False .Value = DateSerial(FoundCell, Month(.Value), Day(.Value)) Application.EnableEvents = True End If End If End With End Sub

  • VBA Target.ColumnをRangeへ

    Excel VBAについてお尋ねいたします。 Excel VBAにて現在選択しているセルの列番号をTarget.Columnで取得することが出来ますが、Target.Columnで取得した列番号(数字)をRange方式のアルファベットに変換する方法はございますでしょうか? Range形式のアルファベットに変換してから、セルに=○○という数式を出力させたいです。 選択する列は、N列~右端までの間です。 取得した列番号を26で割って26で割って26で割って…を繰り返して、商と余でアルファベットを形成するという方法を考えましたが、その場合でもどうやって記述すればいいですか?

専門家に質問してみよう