• ベストアンサー

エクセル:Targetの列番号を英字で出す

Private Sub Worksheet_Change(ByVal Target As Range)   MsgBox Target.Column End sub このコードを書いたシートでセル"B1"の値を変更すると、 メッセージボックスで 2 と出ますが、 B と出したい(列番号ではなく、列の英字で)場合はどのように書けばよいでしょうか。 Left関数やMid関数を使ってTarget.Addressから英字部分を抜き出す、というコードも組んでみましたが、 そんなことしなくても出そうな気がするので、 そのような書き方がありましたら教えてください。

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

  • ベストアンサー
  • jobvba
  • ベストアンサー率50% (2/4)
回答No.2

すみません 質問内容にもありました英字部分を抜き出すコードのほうが遥かに簡単でした できれば流してください

tktk1228
質問者

お礼

回答ありがとうございます。 申し訳ありません、「教えて!goo」内で似たような質問を見つけました。 そちらでもコードを組んで取り出す方法が挙げられていたので、 質問したような都合の良い関数は無いみたいですね。 例えばですけど、Target.retuと書けば出るよ、とかそんな楽な記述があればと思って質問しました(苦笑)。 普通は英字でなくて番号で出した方が扱いやすいんでしょうか。

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

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

実際個人的にはあればと思って、勉強してますが、出くわさないですね。 (1)ユーザー関数 例えば(3)のロジックを使い Function Clmna(n) Clmna=Chr(64 + n) End Function (2)Left関数やMid関数を使ってTarget.Address (3) Private Sub Worksheet_Change(ByVal Target As Range) MsgBox Chr(64 + Target.Column) End Sub (4) Private Sub Worksheet_Change(ByVal Target As Range) 'MsgBox Chr(64 + Target.Column) S = Split("A,B,C,D,E,F,G,H,I,J", ",") '10列まで MsgBox S(Target.Column - 1) End Sub ーー どこかで別の気の効いたやり方を見た気がするが思い出せない。

tktk1228
質問者

お礼

回答ありがとうございます。 何個もありがとうございます。 別の所でも使えそうなんでコピっておきます。 皆さんに答えてもらっておいて申し訳ないですけど、 英字だけ抜く意味が無くなってしまったので結局自分で作ったMidとかInStrとか使ったコードも使わず仕舞いでした。

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

こんばんは。 MsgBox Replace$(Target.Cells(1).Address(0, 0), Target.Cells(1).Row, "") もともと、このアルファベットというのは、可読性だけの問題だと思います。Lotusというよりも、VisiCalc の時代に出来たものだと思います。実際、VBAで、そのアルファベットを取り出しても使いようがありませんよね。Microsoft 自身も、Excelになってから採用した表示形式です。

tktk1228
質問者

お礼

回答ありがとうございます。 >実際、VBAで、そのアルファベットを取り出しても使いようがありませんよね。 いえ、そんなことはありません、使いまくりです、 と書くつもりだったんですが、 確かに英字だけ取り出す意味はありませんでした。 今まではRange("A1")などと指定することが多かったのでどうしても欲しかったのですが、 Target.addressで出る「$」付きのアドレス($A$1)で十分使えました。 (結局まだ英字に執着してますけど)

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

こういうことでしょうか?

参考URL:
http://support.microsoft.com/kb/833402/ja
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 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 以上何か良い方法があれば教えて頂きたいです。また不明な点があれば ご質問ください     

  • メッセージボックスを表示させるエクセルマクロ

    こんにちは。マクロ初心者です。 エクセル(Excel2003)でメッセージボックスを 表示させるマクロが思うようにいかず困っています。 B列に「○○会社」と入力されれば、 「取引先です。」 とメッセージボックスを表示させたいと思い、 次のとおりマクロを作成しました。 -------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 2 And Target Like "*会社" Then MsgBox "取引先です。" End If End Sub -------------------------------- しかし、コピーなどで複数のセルを貼り付ける(入力)行為をすると、 「実行エラー'13': 型が一致しません」と出てしまいます。 Worksheet_Change(ByVal Target As Range)を使っているので、 -------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub If Target.Column = 2 And Target Like "*会社" Then MsgBox "取引先です。" End If End Sub -------------------------------- と、「If Target.Count > 1 Then Exit Sub 」を入れれば、 メッセージは出なくなるのですが、 これだと、A列セルに、コピー&ペーストで複数セルを貼り付けた場合、 「○○会社」があっても、マクロが効いてきません。 複数セルの貼り付けにも対応させるには、 どのようにすればよろしいでしょうか? 基本的なところが理解できていないのだと自覚しておりますが、 どうかご教授願います。 長々とわかりづらい文章ですみません。よろしくお願いします。

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

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

  • エクセル デバッグできるのとできないのがある

    シートイベントについて教えてください。 シートモジュールに --------------------------------------------------------- Option Explicit Private Sub Worksheet_Activate() MsgBox "" End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) MsgBox "" End Sub Private Sub Worksheet_Change(ByVal Target As Range) MsgBox "" End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) MsgBox "" End Sub --------------------------------------------------------- と記載した時に、 F8で動かせるのは、Worksheet_Activateだけなのですがなぜでしょうか? ほかのイベントは、F8で実行させても、OSの音が鳴るだけで、マクロの実行はされません。 ご回答よろしくお願いします。

  • エクセル マクロ 初心者です

    エクセルマクロ初心者です。 以下の2つの Private Sub Worksheet_Change(ByVal Target As Range)を1つのシートで実行させたいのですが、 当方、初心者なので組み合わせ方が分かりません。 よろしくお願いします。 ===No1=== Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Target = StrConv(Target, vbUpperCase) Application.EnableEvents = True End Sub ===No2=== Private Sub Worksheet_Change(ByVal Target As Range) Dim Ans As Integer If Target.Count = 1 Then Ans = MsgBox("コピーは禁止!!", vbCritical) MsgBox "データを消去します。" With Application .EnableEvents = False .Undo .EnableEvents = True End With End If If Target.Count = 1 Then Exit Sub Else MsgBox “複数セルのコピー禁止!" With Application .EnableEvents = False .Undo .EnableEvents = True End With End If End Sub ------------ 上記の2つを1つのシートで動作させたいのですが、うまくいきません。 単体では、動作します。

  • エクセルVBAでTargetのセルに設定された「名前の定義」の取得方法は?

    例えば、A1、B2、C3セルに「名前の定義」で、それぞれ入力A、入力B、入力C という名前がつけてあります。 それらのセルに入力があった場合、Select Caseで分岐させ作動するマクロをつくりました。 簡略化すると以下のようなもので、一応正しく作動します。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("入力A,入力B,入力C")) Is Nothing Then Exit Sub Select Case Target.Address(0, 0) Case "A1" MsgBox "A処理します。" Case "B2" MsgBox "B処理します。" Case "C3" MsgBox "C処理します。" End Select End Sub ただ、せっかくセルに名前を定義してあるのに、個々の入力セルの判定をTarget.Addressでしているのが不満です。 ( ̄~ ̄;) 定義された名前を使えないかと以下のようにやってみましたが実行時エラーで「サポートしてません」となってしまいます。 (T.T) Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("入力A,入力B,入力C")) Is Nothing Then Exit Sub Select Case Target.Names.Name 'ここでエラー Case "入力A" MsgBox "A処理します。" Case "入力B" MsgBox "B処理します。" Case "入力C" MsgBox "C処理します。" End Select End Sub どうやったら、Targetに設定されている名前を取得できるのでしょうか? (^∇^`)? 実際の例はもっと対象が多いので、Select Caseを使わない以下の方法は避けたいのです。 If文の羅列(これでも正しく作動はします。) Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("入力A,入力B,入力C")) Is Nothing Then Exit Sub If Not Intersect(Target, Range("入力A")) Is Nothing Then MsgBox "A処理します。" ElseIf Not Intersect(Target, Range("入力B")) Is Nothing Then MsgBox "B処理します。" Else MsgBox "C処理します。" End If End Sub なにとぞよろしくお願いします。 (o。_。)oペコッ

  • エクセルvba  (ByVal Target As Range)について

    シートのイベントプロシージャーが Private Sub Worksheet_SelectionChange(ByVal Target As Range) End Sub となりますが (ByVal Target As Range)部分は何なのでしょうか? 何のためにあるのかわかりません。 Private Sub Worksheet_SelectionChange() End Sub としたらエラーが返ってきました。 理由を教えてください。 よろしくお願いします。

  • EXCELでセルの変更をしたらマクロを実行

    このようなコードを作成しました。 Private Sub Worksheet_Change(ByVal Target As Range) If (Target.Address = "$D$3") Then ★ End If End Sub ★に MsgBox "変更したよ" といれるとちゃんと表示されます。 ですが、 If D9 = "テスト" Then MsgBox "テスト" End if としても何も起こりません。 Call KEISAN のように呼び出すようにしても何も起こりません。 どこがダメなのでしょうか? よろしくお願いします。

  • VBA:結合されたセルに対する「Target」について

    Private Sub Worksheet_Change(ByVal Target As Range)   If Target = "" Then     MsgBox "空欄です"   End If End Sub 上記コードで、セルにカーソルを合わせてDeleteキーを押すと正常にメッセージが表示されます。 ただし、カーソルを合わせたセルが結合されていた場合、 「型が一致しません」というエラーで停止してしまいます。 結合されているセルに対しても同じ処理をするには、   If Target = "" Then の部分をどのように指定すればよいでしょうか。

  • EXCELマクロでのシート間のデータ同期方法

    質問させていただきます。 EXCELにて、"シート1"のA1~C3と"シート2"のD4~F6を 同期化したく考えております。 ・いわゆる一方のシートが「読み取り専用」になってしまうリンク貼り付けではなく、シート1、シート2相互が書き換え可能の同期化です。 ・A1とD4、B3とE6、のように互いに照合箇所のセル同士を同期反映させたいと考えております。 なお、他の質問を参照したところ、 シート1のA1とシート2のD4の単一セルを同期かする方法は確認できました。(以下参照) ***************************************************************** シート1のコードは Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then Worksheets("シート2").Range("D4") = Target End If End Sub シート2のコードは Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$D$4" Then Worksheets("シート1").Range("A1") = Target End If End Sub *************************************************************** これを参考にVBAの シート1のコードエディターに Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$2" Then Worksheets("シート2").Range("D5") = Target End If End Sub シート2のコードエディターに Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$D$5" Then Worksheets("シート2").Range("A2") = Target End If End Sub というように追記していったのですが、エラーとなってしまいます。 お詳しい方がおられましたらお願いいたします。

専門家に質問してみよう