- ベストアンサー
VBAでColumnの表示方法について教えてください
- VBAを使って特定の列を判定する場合、どのように列を指定すればよいのでしょうか?インターネットで検索すると、Columnsメソッドを使用する方法が見つかりますが、実行時エラーが発生してしまいます。どのように修正すれば特定の列をアルファベットで指定できるのでしょうか?
- OKWaveの不具合により回答ができないため、質問をこちらでお伺いします。VBAを使用して特定の列を指定する場合、列BSをアルファベットで表記する方法を教えてください。
- VBAを使用して特定の列を指定する際、インターネットで見つかるColumnsメソッドの使用方法を試したところ、実行時エラーが発生しました。どのように修正すれば特定の列をアルファベットで指定できるのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
質問文中でご提示の参照URLは・・なんというか・・ 少し理解が進んでから見た方が良かったかもしれませんね。 初心者さんには少しばかり不親切な気がします。 > 結論から言うと、皆さんと同様ではあるのですが If (target.Column <> Columns("BS").Column Then Exit Sub できっと行けると思いますよ。 右辺の「Columns("BS")」にも「.Column」を付けてやるのがミソです。 以下、駄文を長々と書きますので、ご興味なければスルーなさってください。 そんなわけで、「イミディエイトウインドウ」を使ってみると、 「返り値がどうなるか?」が前以て解るので、 少しだけこういう疑問の解決に近づけるかもしれません。 ※使い方を細かく説明するつもりは無いです。 悪しからず、ご自身でお調べください。 さて。 エクセルとVBEのウインドウを左右並べて表示し、 実際に手を動かしながら、少し考えながら進めると きっともう少しだけ解り易いと思います。 まず、A1にフォーカスを取り、イミディエイトウインドウに columns("BS").select と入力して、Enterキーを押してみます。 おそらく、エクセルのウインドウでは BS列全体を選択した状態になっているはずです。 では次に、BS列を選択したまま(BS1セル単独でも良いんですが)、 イミディエイトウインドウに ? selection.column と入力し、Enterキーを押してみましょう。 今度は数字で「71」がイミディエイトウインドウに返ってくるはずです。 同様に ? columns("BS").column と入力し、Enter。これも「71」が返ってくるはず。 では、イミディエイトウインドウに cells(selection.row, selection.column).value=selection.column とすると、どうでしょう? フォーカスを持ったセルに列番号がひょっこり出てくるはずです。 イミディエイトウインドウはこんな風に、 ・簡単な命令を試行してみたり ・返り値の確認をしてみたり などなど、時々便利に使えますので、 多分、覚えておいて損をすることは無いと思います。 では本題、イミディエイトウインドウに ? columns("BS") だけでEnterキーを押しましょう。 きっと「型が云々」というエラーが吐き出されることでしょう。 以上から「Columns("BS")」は「単独では意味を成せない」ことが解ります。 「オブジェクト」「メソッド」「プロパティ」という言葉に対し、 ある程度、理解が進むときっとこの意味も解ってくると思いますよ。 つまり、「Columns(ナントカ)」はオブジェクトであり、 メソッドやプロパティなどを伴って、初めて意味を成すのです。 そういう意味で、前述「初心者には不親切かも」につながるわけです。 ただ、これら用語を覚えることに意味はあまりないのかもしれません。 私も「メソッド」「プロパティ」の区別はイマイチですし(笑)。 そんなこんなでこの場合、 「Target.Column」は変更されたセルの「列番号(正の整数)」を持ちます。 そことの比較なので、右辺にも「数値」を指定してやらないといけない、 というのが最終的な説明ですね。 ここに「列記号(文字列)」や「エラー値」を与えて比較しても、 VBA(EXCEL)としては比較しようがないですよ、ってことです。 また、上述の実験の通り、どれだけ頑張っても 単純なやりかたで「BS」という「列記号」が返ることはなさそうです。 ※例えばA1セルに「列番号(正の整数)」を準備しておき ワークシート関数なら「=SUBSTITUTE(ADDRESS(1,A1,4),1,)」 VBAなら例えば(長いですが) Replace(Cells(1, Range("A1")).Address(RowAbsolute:=False, _ ColumnAbsolute:=False), "1", "") で取れないことはありません。面倒ですけどね。 ※※全般にわたり「列記号」という言葉を使用していますが、 これがマイクロソフト的に「正しい用語」なのかどうかは 保証できませんのでご容赦くださいませ。
その他の回答 (3)
- real beatin(@realbeatin)
- ベストアンサー率82% (174/211)
こんにちは。 > 例えば、 以下のような VBA を記述したいと仮定します。 > If (target.Column <> "列BS と表記されている列") Then Exit Sub > どのように修正すれば、 アルファベット指定できるでしょうか。 この記述を活かす("BS"という文字列を使って<>比較を成立させる) 書き方としては、 If Target.Column <> Columns("BS").Column Then Exit Sub というのが、直接の回答になります。 <>比較式の右辺を"BS"という文字列のみにして実現したい、 というようなお話でしたらば、 If Split(Target.EntireColumn.Address(0, 0), ":")(0) <> "BS" Then Exit Sub のような書き方も出来なくはないですが、 却って複雑で解り難いことになってしまいますよね。 > If (target.Column <> "列BS と表記されている列") Then Exit Sub > 上記の私のソースコードの何が悪かったのでしょうか。 If (target.Column <> "BS") Then Exit Sub という意図で書かれているという解釈ですが、 まず、括弧は要らないので、 If Target.Column <> "BS" Then Exit Sub という風に書換えてみます。(↑どちらもエラーになります) Target.Column <> "BS" の部分の比較式について、 左辺 Target.Column は 数値型 右辺 "BS" は 文字列型(数値として解釈しようのない値) 数値型と文字列型を 演算子<> で比較すれば、その部分で、 実行時エラー#13 型が一致しません。 と、エラーストップに掛かります。 データ型の異なる、比較できない、値を比較しようとしていることが、 ご提示のソースでの実行時エラーの原因です。 上掲の修正例では、1例めは両辺を数値、2例めは両辺を文字列、 という風にそれぞれ両辺のデータ型を統一することで、 比較式を成立させています。 質問文の後半に触れられているのは、 If Target.Column <> Columns("BS") Then Exit Sub というような記述を試したということでしょうか?(↑エラーになります) これも、左辺は数値、右辺はオブジェクト(厳密にはVariant配列)、 異なるデータ型を比較式に渡していますから、同様に、 実行時エラー#13 型が一致しません。 と、エラーストップに掛かります。 ちなみに、 "列範囲"としての"Range型オブジェクト"を返す Columns と 指定されたセル範囲の先頭の列番号を数値で返す Column とは、まったくの別物です。 回答、以上です。 尚、疑問が残る場合は、 具体的なソースを(可能な限りプロシージャ単位で)添えて、 こちらで同じ状況を再現できる程度の情報を整えて、 補足欄にでも書いてみて下さい。 蛇足ですが、 私信=メールを許可なく公開するのは、ルール違反ですね。 (許可を得て公開したのだとしたら、その旨明示するものですし。) OKWAVEの利用規約に書かれているということを仮に無視したとしても、 却ってあなたが不利益を被る結果になり兼ねませんから、以後気をつけましょう。
お礼
ありがとうございます。 If Target.Column <> Columns("BS").Column Then Exit Sub で正常に動作することを確認できました。
- imogasi
- ベストアンサー率27% (4737/17069)
target.Columnが返す値は、数値だと思うので、<> の次の値は、「数値」にしないとエラーになるはず。Targetはセル範囲またはセルだと思うので。 この数値は列番号(エクセルでの名称は列記号と言わないで、列番号というようだ)という数です。 ーー ちなみに列BXの列番号は、という疑問の場合、目視で確認したり、計算では面倒だが Sub test02() c = Columns("BX").Column MsgBox c End Sub を実行してみれば76と返ってきてすぐわかる。 VBAではCells(1,"BX")もCells(1,76)も使えるので、あまり考える場合は少ないが、列番号が76となっているのは、どの列か、などの場合に使える。 この76から逆にBXという文字列を出すのはやや複雑です(略)。 行番号もついていて表示してよいなら Sub test04() MsgBox Cells(1, 80).Address End Sub で、簡単。
- imogasi
- ベストアンサー率27% (4737/17069)
インターネット以下の部分は、質問の意味が理解できなかった。 ーー H列の第1行目に、「BS」(仮に全角と仮定)と文字列が入っていて、その列を指定したいなら Sub test01() c = Rows("1:1").Find("BS").Column MsgBox c Cells(2, c) = "氏名列" ’私の勝手に入れたもの End Sub のようなコードを使えばよいのでは? 質問文章が長すぎて、読むのがつらく、十分理解してないなら、この回答は無視してください。
補足
ありがとうございます。 だいたい、 そういう意味です。 target.Column <> 9 は正常動作で、 target.Column <> "BS" は ---------------------------------------- 実行時エラー '13': 型が一致しません。 ---------------------------------------- になります。 なんでだろう、 という質問なのですが、 私自身、 何が起きているのか理解できていないため、 質問が複雑にならざるを得なかったのです。 すいません。
お礼
ありがとうございます。 If Target.Column <> Columns("BS").Column Then Exit Sub で正常に動作することを確認できました。 イミディエイトウインドウも覚えます。