列の数を求めるには

このQ&Aのポイント
  • Private Sub Worksheet_Change(ByVal Target As Range)内のマクロでRightEndという変数を宣言し、シートの右端がTであることを示しています。
  • 値が変化した列の隣の列からRightEndまでの列の数を求めるにはどうしたらいいでしょうか?
  • 求められた列の数に基づいて、.Offset(, 1).Resize(, 列の数).ClearContentsに代入することができます。
回答を見る
  • ベストアンサー

列の数を求めるには

よろしくお願いします いつもgooの皆さんに大変お世話になっております Private Sub Worksheet_Change(ByVal Target As Range)内のマクロで Dim RightEnd as String RightEnd="T" と変数宣言しています シートの右端はTだということです それでは、値が変化した列の隣の列からRightEndまでの列の数を求めるには どうしたらいいでしょうか? 列の数が求められれば .Offset(, 1).Resize(, 列の数).ClearContentsに代入したいと思います うまく説明できていませんが、よろしくお願いします

  • maamaa
  • お礼率85% (274/322)

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

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

続けてお邪魔します。 >LeftEndの右隣の列から(この場合C列から)RightEndまでをClearContentsしたいときは・・・ LeftEnd と RightEnd は文字列型として宣言しているのですよね? 文字列の四則計算はできませんので、 一番簡単なのは文字列をセルの列番号として一旦置き換え、その差を求める方法だと思います。 今回の質問の場合、 LeftEnd が「E」、RightEnd が「B」とした場合、5-2で「3」を求めたいとなれば Range(RightEnd & 1).Column - Range(LeftEnd & 1).Column または Cells(1, RightEnd).Column - Cells(1, LeftEnd).Column のようにしてみてはどうでしょうか? (セルの行番号はいくつでも構いません)m(_ _)m

maamaa
質問者

お礼

なんどもお世話になってすみません 確かに指摘の通りです 分かりました やって見ます ありがとうございました 何度もお世話になって申し訳ありません

その他の回答 (2)

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

No.1です。 はぁ~~!そういうコトだったのですね! 色々やり方はあると思いますが、 Private Sub Worksheet_Change(ByVal Target As Range) Dim c As Range, myRng As Range Dim Rightend As String Rightend = "T" Set myRng = Range(Rightend & ":" & Rightend) With Target If .Count = 1 Then If .Column < myRng.Column Then .Offset(, 1).Resize(, myRng.Column - .Column).ClearContents End If End If End With End Sub こんな感じではどうでしょうか?m(_ _)m

maamaa
質問者

補足

tom04さん お世話になっております 私の説明ミスでお手数おかけしています 現在、マクロが70行を超えてしまっています そこに、教えてもらった内容で組み込もうとしますが、狙った動きになりません そこで、もっと単純にするために .Offset(, 1).Resize(, ????).ClearContents で RightEnd="E" ClearContentsする右端の列はE LeftEnd="B" ClearContentsする基準の列はB としたとき LeftEndの右隣の列から(この場合C列から)RightEndまでをClearContentsしたいときは .Offset(, 1).Resize(, ????).ClearContents の????部分は3ですが  ????はどういう式で書けばよいでしょうか?  

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

こんにちは! 同じ行に「T」は複数存在しない!という前提です。 メッセージボックスに表示させています。 Private Sub Worksheet_Change(ByVal Target As Range) Dim RightEnd As String Dim c As Range RightEnd = "T" With Target If .Count = 1 Then Set c = Rows(.Row).Find(what:=RightEnd, LookIn:=xlValues, lookat:=xlWhole) If Not c Is Nothing Then If c.Column > .Column Then MsgBox c.Column - .Column End If End If End If End With End Sub こんな感じでは同でしょうか?m(_ _)m

maamaa
質問者

補足

tom04さん、おはようございます いつもお世話になっています 私の説明が間違っていました。深くお詫び申し上げます tom04さんの貴重な時間を無駄にしてしまいました Tはセルの値ではなく、T列のTです 完全に私の説明不足です 質問を変えさせてください 仮に、列Bから列E迄なら、列の数は4です 列Bの右隣の列から(C列から)E列迄をClearContentsしようとすれば .Offset(, 1).Resize(, 3).ClearContentsですが RightEnd="E"とした場合("E"はE列のEです シート右端の最終列はE列という意味でRightEndです) .Offset(, 1).Resize(, 3).ClearContentsの3の部分を変数で表現するには マクロをどう書いたら良いでしょうか?

関連するQ&A

  • マクロの解説をお願いします。

    マクロを勉強したのが10年近く前ですっかり頭から抜けてしまっているので、教えていただければと思います。 前に質問して、回答をいただいたマクロの意味をどなたか教えてください。 http://okwave.jp/qa/q7430751.html Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("B3:B100")) Is Nothing Then Select Case Target.Resize(1, 1).Value Case "イ" Target.Offset(, 1).Value = "A" Target.Offset(, 2).NumberFormatLocal = "0000" Target.Offset(, 2).Value = "0000" Target.Offset(, 3).Value = "-" Case "ロ" Target.Offset(, 1).Resize(, 3).ClearContents End Select End If Private Sub Worksheet とは?? というところからの超初心者です。 なんとかこれから10年のブランクを埋めて勉強していきたいと思っています。 よろしくお願いします。 また、そこの質問にも書きましたが、Resizeはここではどうして必要なのかがわかる方がいらしたら教えてください。 よろしくお願いします。

  • エクセルのマクロ

    セルの値が変わったら動くマクロですが、2つ書くとエラーが出ます。 どのように直したらいいでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Address If Intersect(Target, Range("EK22")) Is Nothing Then Exit Sub Else Range("EK24:EM28").Select Selection.ClearContents End If End Sub Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("EK24")) Is Nothing Then Exit Sub Else Range("EK27:EM28").Select Selection.ClearContents End If End Sub

  • Range("B19:T19").Select

    よろしくお願いします Private Sub Worksheet_Change(ByVal Target As Range) 内のマクロで Range("B19:T19").Selectの 19をTarget.Rowで表現すると Range("B19:T19").Selectをどう直したらいいでしょうか? こんな簡単なことが分かりません どなたか教えてください

  • この列が変更されたらマクロ実行、というコードで、○列目だけは除外としたい

    B列からR列目までが変更されたらマクロ実行というコードを組んでいます。 その中で、C列とD列だけは除外としたいのですが、どのようにしたらいいのでしょうか? コードの始まりは以下のような感じです。 Private Sub worksheet_change(ByVal Target As Range) c = Target.Column If 2 <= c And c <= 16 Then :

  • VBA:Callステートメントでいつでもイベント発生可能な準備をしたい。

    タイトルどおり、Callステートメントでいつでもイベント発生可能な準備ができるようにしたいと考えています。しかし、Sub 実行準備SUBでエラーが出ています。どこをどう直せばよいのか教えて頂きたいです。 Private Sub Auto_Open() MsgBox "Ctrl + t でイベント実行準備を行います。" Application.OnKey "^{t}", "実行準備SUB" End Sub '--------------------------------------------------- Sub 実行準備SUB() Dim Target As Range Target = Range(Cells(1, 1), Cells(100, 100)) Call Worksheet_Change(ByVal Target) End Sub '--------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim r As Range For Each r In Target If r.Column = 2 Then r.Offset(0, -1).Value = Now End If Next r End Sub イベントは、シートの2列目のセルに変更があれば、1列目に日付時刻を記入するというものです。宜しくお願い致します。

  • エクセルVBAでセル変化したら別のセルへコピーする

    おはようございます。VBAをはじめて浅い初心者です。 あるセルに数字および文字列が入力されたら違うセルへコピーしたいのですがどのようにすればできますか。 Private Sub Worksheet_Change(ByVal Target As Range)とか 使用してつくればいいのですか?教えてください。

  • エクセル:Worksheet_Changeイベントについて

    Private Sub Worksheet_Change(ByVal Target As Range)   If Target.Column = 4 Then     Target.Offset(0, 1).ClearContents     Target.Offset(0, 2).ClearContents   ElseIf Target.Column = 5 Then     Target.Offset(0, 1).ClearContents     Target.Offset(0, -1).ClearContents   ElseIf Target.Column = 6 Then     Target.Offset(0, -1).ClearContents     Target.Offset(0, -2).ClearContents   ElseIf Target.Column > 6 Then     Target.Offset(0, 4 - Target.Column).ClearContents     Target.Offset(0, 5 - Target.Column).ClearContents     Target.Offset(0, 6 - Target.Column).ClearContents   End If End Sub D列に値が入ればE,F列の値を削除、E列に値が入ればD,F列の値を削除、 F列に値が入ればD,E列の値を削除、G列以降に値が入ればD,E,F列の値を削除、 というマクロを組みたいです。 先日似たような件で質問し、上記のコードを作りました。 1つのセルに値を入力する場合は問題無いのですが、 範囲指定の右下(黒十字が出る)をマウスでドラッグで引っ張る、もしくは、範囲指定した部分をドラッグして移動、 という操作をすると、値がついてくる時とそうでない時があります。 数字の大きいセル番地だと何故かそのような現象が出ません。 どういった理由からで、どのように修正すればよいでしょうか。

  • Excel  関数をまたいだTargetの使用

    excel2013 OS はwindows8を使用しています。 Excelのマクロで、以下のコードについて質問です。(コード内の・・・は省略の意) Private Sub Worksheet_Change(ByVal Target As Range) Dim ・・・・・・・      ・      ・  If Target.Value = ・・・・・    Call myfunction End If End Sub Sub myfunction() If 条件 Then Target.Offset(0,1).Value = "aaa" End If End Sub このマクロのPrivate Sub Worksheet_Change(ByVal Target As Range)を実行するとエラーが 出ます。エラーの内容は「オブジェクト変数またはwithブロック変数が設定されていません」 となり、 Target.Offset(,1).Value = "aaa" の行が黄色く表示されます。 myfuncton内で使用しているTargetが何なのかがわからないというエラーだと理解しています。 そこで私は以下の2つを試しました。 1つめはうまくいかず、2つめは何か2度手間のような感じがするのですが、正常動作する ようです。 そこで質問なのですが、Targetをプロシージャをまたいで利用したい場合に一般的に用いら れている手法などがあれば教えて頂きたいです。 1つめ・・Targetをプロシージャをまたいで使えるようにコードの一番上の部分 、つまり、Private Sub Worksheet_Change(ByVal Target As Range)の一行上の 部分にDim Target As Range と宣言してみました。が、これはうまくいきませんでした。 2つめ・・適当な(この場合e)変数を宣言し、プロシージャをまたいで使用する。 Dim e As Range Private Sub Worksheet_Change(ByVal Target As Range) Dim ・・・・・・・      ・      ・  If Target.Value = ・・・・・ Set e = Target    Call myfunction End If End Sub Sub myfunction() If 条件 Then e.Offset(0,1).Value = "aaa" End If End Sub 以上何か良い方法があれば教えて頂きたいです。また不明な点があれば ご質問ください     

  • エクセル95のマクロ

    エクセル95で Private Sub Worksheet_Change(ByVal Target As Range)  というのは使えるんでしょうか? リターン押したときに移るセルを操作したいので 代わりになるものでもあれば教えて頂きたいです。 よろしくお願いします。

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

    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列目のセルの色を薄い青にする。なければなしとアラートを出す」 ように改造したいのですが どうすればいいでしょうか? どうかお願いいたします。

専門家に質問してみよう