Excel vba をはじめて1ヵ月程度の初心者ですが、すいません質問させて下さい。

シートをCodeNameでSheets()みたいに指定はできるのでしょうか?
また、図形をIDでShaps()みたいに指定する方法はあるのでしょうか?

どちらも名前(.Nameの方)は変えてある状態です。
例えばアクティブシート名は"テスト"、図形名は"サンプル"みたいな状態です。
名前は自由に変えていきたいのですが、名前が変わってもかわらず指定できるようにしたいです。

Sub test1
Debug.Print Activesheet.Name
Debug.Print Activesheet.Index
Debug.Print Activesheet.CodeName
Debug.Print Excel.Selection.Name
Debug.Print Excel.Selection.Index
Debug.Print Excel.Selection.ShapeRange.ID
End Sub

どなたか御教授おねがい致します!!

このQ&Aに関連する最新のQ&A

A 回答 (3件)

質問者は多言語の熟練者ですか。

VBAも相当な経験者とか。初心者はこんな質問はしませんね。
Sub test1()
MsgBox ActiveSheet.Name
MsgBox ActiveSheet.Index
MsgBox ActiveSheet.CodeName
'MsgBox Excel.Selection.Name
'MsgBox Excel.Selection.Index
'MsgBox Excel.Selection.ShapeRange.ID
End Sub
をやってみるとコメントアウトした行以外は動きます。
CodeName
http://kobobau.com/xls/yama/vba/worksheet1.html
ーー
テストで7シートに増やしました。
Sub test03()
Dim sh As Worksheet
For Each ws In Worksheets
MsgBox ws.CodeName
Next
End Sub
Sheet7からSheet5、Sheet1からSheet4
と表示されます。
Sheet6とSheet2を名前を変えました。
Sub test04()
MsgBox Sheet6.Range("A1")
MsgBox Sheet2.Range("A2")
End Sub
で正しくそのシートの値を取ってきました。
だからワークシートについては、VBAの中ではこういう使い方で役立つと思います。
ーーー
>Excel.Selection.Name
とは何をイメージしているのか。
Googleで「Excel.Selection.Name」としてもこの質問以外記事なし。
選択されているシートのシート名のことか?
複数シートを選択しているときはそういうのはニーズが有るが1つだとActivesheetと変わらないような。
ーーーーー
Shapeについては、名前(Name)はVBAでしか変えられない(操作では変えられない)と思いますが。
作成当初「Oval 4」と言う図形が有る。
Sub test07()
ActiveSheet.Shapes(2).Name = "TTT"
End Sub
でTTTに変えた。
Sub test08()
MsgBox ActiveSheet.Shapes("Oval 4").Name
End Sub

TTTと出ることから、Oval 4は名前が変更されても、識別に使えるのではないか。

この回答への補足

御回答ありがとうございます!
imogasiさんすいません。嬉しいですが、実際にVBAを始めたばかりで他言語は全くです。。。
Sub test04()は目から鱗です!!この回答を頂きたかったです!!
バージョンによるのかもしれませんが、shapeの名前は名前ボックスで変更できました。
Sub test07()とSub test08()はなるほどです。
御指導を参考にちょっといろいろ試してみます!
参照して下さったページをちょっと見てみます!

↓は何か図形を選択した状態で実行しないとエラーになってしまいます。すいません!!
Sub test1
Debug.Print Excel.Selection.Name
Debug.Print Excel.Selection.Index
Debug.Print Excel.Selection.ShapeRange.ID
End Sub

補足日時:2009/05/15 22:16
    • good
    • 0
この回答へのお礼

出来ました!!
imogasiさん、どうもありがとうございます!!
参照して頂いたページは難しいですね、勉強してみます。
御回答どうもありがとうございます!!

お礼日時:2009/05/16 19:35

こんにちは。



ご質問者さんの場合は、一ヶ月程度のレベルだというと、通常は、だいたい、基本構文が終わって、VBA関数のところに入るかどうか、または、人によって、UserForm の設定を始めるところに入るのではないか、と思います。まだ、Sheets とWorksheets の違いすら分からない状態だと思います。

前回の、2次元配列変数にオブジェクトを入れたり、また配列変数の中から、最大値を特殊な方法で求めようとしていましたが、ふつう、プログラムの経験のない人は、そんなことは思いつきもしません。もし、どこかのネットで見たコードなら、そういうところに手を出さないほうがよいと思います。

#2で、imogasiさんが、他の言語の熟練者か、VBAの相当な経験者かと、お聞きになるのも当然だと思います。そういう質問は、ある程度の経験のある回答者は、警戒してしまいます。

>名前は自由に変えていきたいのですが、名前が変わってもかわらず指定できるようにしたいです。

今回の質問は、通常、実践のテクニックでしか出てこないものです。#2のimogasiさんのリンク先の5番目のプロシージャ--ループしてCodeName をヒットする使い方は、残念ながら、あまり意味がありません。実際に使う必要性がありません。

シート名を変えてもコードにエラーを出したくないという質問は、某VBA専門掲示板で読んだことがあります。VBAの経験者さんたちは、Windows をブロテクトすればよいというのが、多くの人の意見で、通常、マクロ処理を目的としたブックのシートの名前を、ユーザーに自由に変えられることを許すことまで、一般的に考えないからです。

>シートをCodeNameでSheets()みたいに指定はできるのでしょうか?

結論から言うと、その質問自体はできません。ループしたり配列変数に入れるなどは、テクニックだけです。しかし、一意のシートとして扱うことも可能ですが、自分なりのテクニックを開発するしかありません。私自身、その解決方法は持っています。そういうことは経験の中で覚えることで、教わることではないと思います。

VBAを覚えるためには、自分で考え抜いて、こんな使い方があるのかという驚きや、自分で開発する喜びがないと、つまらないと思います。残念ながら、前回の私の回答で、あるテクニックを使ったのですが、それにはお気づきにならなかったようです。それとも、ご存知だったかもしれませんね。私には、tkh_tkhさんは、あまりにもテクニックに走りすぎているようには思いましたが、世の中は広いもので、だいたい、3ヶ月で、上級コースを終えてしまい、半年で一通りOffice 全体のVBAのプロレベルまで覚え、その後は、ASPやJavaScript,Wscrip などを始め、Cや.Netなどの他言語で補充して、2年でVBAのプロになる人もいます。VS2008やVSTO や高価な書籍を購入しなければならなくなってきます。しかし、どうやら、それ以上の人たちもいるようですね。

そういう人たちと、私などでは、悔しいけれども、最初のスタート時点から違います。そういう人は、掲示板の質問者ではなく、突然、ベテランとして掲示板に登場してくるようです。ここのカテゴリで、「専門家」と書いている人がいますが、VBAのプロなんていうのは、本来、存在しないに等しいです。VBAインストラクタなら養成機関もあり、可能でしょうけれども、VBAのプログラミングで食べられる人は少ないからです。ともかく、なるべく自分で調べながら、頑張ってみてください。

余計なことを書きすぎ、失礼しました。
    • good
    • 0
この回答へのお礼

Wendy02さん御回答ありがとうございます!
>余計なことを書きすぎ、失礼しました。
とんでもないです!アドバイスとして受けとめさせて頂きます!
Wendy02さんには何度か御回答頂いていますが、御礼として申し上げる言葉も少なく、申し訳なく思っています。
(でも、プログラムの経験は一切ありません。なので、素人そのもので、特殊であったり、テクニックなのか、基本事なのかの境界が分からない状態です。危険なコードになり得るという事ですね。御迷惑もかけていたら申し訳ないです。)
御回答して頂けた皆様のおかげで、相当理解を助けて頂いています!VBAを楽しまさせて頂いてます!
今後も宜しくお願い致します!

お礼日時:2009/05/16 19:31

Sub TS()


 sNumber = 1
 Worksheets(sNumber).Select
 sName = Selection.Worksheet.Name
 MsgBox sName
End Sub

これを実行してみてください
VBAでは左側から1,2,3,,,,という具合に指定できます
ただ、シートのタブの位置を動かすと番号も変わります

この回答への補足

早速の御回答ありがとうございます!
記述して頂いたコードを試してみました!
つまり、Indexで左側から1,2,3,,,となる特性を利用して指定するということですね。
シートが複数ならばそれをカウントしてで、これで名前の変更にも対応しますね!
ありがとうございます!
ASIMOVさんの御指摘の通りの、ただ、シートのタブの位置を動かす場合は、追いかけ方が・・・
やはりコードネームやIDでの指定方法はないという事でしょうか?

補足日時:2009/05/15 21:26
    • good
    • 0
この回答へのお礼

ASIMOVさん御回答どうもありがとうございます。
アドバイスを頂き、非常に勉強になりました!
また御指導お願い致します!

お礼日時:2009/05/16 19:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qマクロでシートタブ色の変更

例えば、A1に数字が入ればシートタブが青色に、A1とA2に数字が入ればシートタブが黄色に、
A1とA2とA3に数字が入ればシートタブが赤色に、このようにするにはどのように記述したら良いでしょうか、よろしくお願いいたします。

Aベストアンサー

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Range("A1:A3"), Target) Is Nothing Then
Worksheets("Sheet1").Tab.ColorIndex = -4142
If Range("A1") <> "" And Range("A2") <> "" And Range("A3") <> "" Then
Worksheets("Sheet1").Tab.ColorIndex = 3
ElseIf Range("A1") <> "" And Range("A2") <> "" Then
Worksheets("Sheet1").Tab.ColorIndex = 6
ElseIf Range("A1") <> "" Then
Worksheets("Sheet1").Tab.ColorIndex = 5
End If
End If
End Sub
これで良いのかな。
ーー
結構、初心者には勉強点があるように思う。
(1)シートイベントというものの勉強
(2)マクロの記録でタブの色を変えるコードを勉強する
また色を抹消するコードを勉強する。
(3)3つの場合の場合分け(条件の多いほうから聞く)
(4)A1:A3以外は素通りさせる方が良いかな(ntersectの利用。これはIFでORを使っても出来る)
数字かどうかのチェックを略している(IsNumericで、使って追加してください)
しかしこの質問のアイデアは珍奇で使えるのかな(今まで質問に出たこと無いような)。
Changeイベントを扱う難しさなどがある。上記コードでは多数例テストして無いので、出来るだけテストして見てください。

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Range("A1:A3"), Target) Is Nothing Then
Worksheets("Sheet1").Tab.ColorIndex = -4142
If Range("A1") <> "" And Range("A2") <> "" And Range("A3") <> "" Then
Worksheets("Sheet1").Tab.ColorIndex = 3
ElseIf Range("A1") <> "" And Range("A2") <> "" Then
Worksheets("Sheet1").Tab.ColorIndex = 6
ElseIf Range("A1") <> "" Then
Worksheets("Sheet1").Tab.ColorIndex = 5
End If
End I...続きを読む

Q列、行番号などをDebug.Printするには?.

よろしくお願いします
作りたいものがあって、最近マクロの勉強を初めた者です

以下ことをDebug.Printしたいのですが(Debug.Printそのものも今日知りました)
どのように書いたらいいでしょうか
RowだったりRowsだったり、また、前に何か付いたりで、頭の中が整理できていません

質問1
マクロは Private Sub Worksheet_SelectionChange(ByVal Target As Range) に書けばいいのでしょうか?

質問2
知りたいのは、シート左端の行番号をクリックしたときに得られる値で
行番号とか他に分かる値すべて知りたいです(Debug.Printしたいです)

質問3
同じく、列のABCD等をクリックした時に得られる値で
列番号とか、他に得られるすべての数値をDebug.Printしたいです

質問4
あるセル範囲をマウスで選択した時も同様に得られる数値を知りたいです

教えてもらう身分で質問数が多すぎますが、どなたか教えてください

Aベストアンサー

○何をしたいのか
→何かを「選択した」ときに、その選択した(された)モノの情報を調べたい

⇒どうしたら良いのか
(方法1:セル範囲等)
選択されたモノに紐づいている「イベントプロシジャ」(自動起動マクロ)が存在している場合は、それを使って「選択されたモノ」それ自体を取得、情報を取り出す

(方法2:たとえば図形等)
選択されたモノにイベントが紐づいていない場合、手動マクロを起動し、「今選択されているモノ」の情報を取り出す



○方法1の具体的な展開の基本
例えばセル範囲の場合:
選択される可能性のあるセル範囲としては、次の状況が考えられます
 一個のセルを選択した場合
 ヒトカタマリの(矩形の)セル範囲
 とびとびのセル範囲
 列を1列あるいは複数列(カタマリ・とびとび)
 行を1行あるいは複数行(カタマリ・とびとび)

これらのケースは、いずれもWorksheet_SelectionChange(あるいはWorkbook_SheetSelectionChange)イベントによって取得できます。具体的に何を選択した時、イベントが何を取得しているのかケースごとに調べたり、あるいは具体的なマクロでどう処理を進めるのか漏れなく考えなければいけません。

手順:
シート名タブを右クリック、コードの表示を選ぶ
現れたシートに下記をコピー貼り付ける

private sub Worksheet_SelectionChange(byval Target as excel.range)
msgbox target.address
end sub

上述したようなさまざまな「セルの選び方」に応じて、具体的に何が(どのようなタイミングで)targetに取得されたか、(回答をフンフン読んで分かった気になるんじゃなくて)実際にあなたの手を動かして確認してください。



○ご質問の具体的な回答
練習用のイベントプロシジャを消去、改めて下記をコピー貼り付ける

private sub Worksheet_SelectionChange(byval Target as excel.range)
debug.print target.address,
debug.print target.areas.count,
debug.print target.row,
debug.print target.rows.count,
debug.print target.column,
debug.print target.columns.count
end sub

○何をしたいのか
→何かを「選択した」ときに、その選択した(された)モノの情報を調べたい

⇒どうしたら良いのか
(方法1:セル範囲等)
選択されたモノに紐づいている「イベントプロシジャ」(自動起動マクロ)が存在している場合は、それを使って「選択されたモノ」それ自体を取得、情報を取り出す

(方法2:たとえば図形等)
選択されたモノにイベントが紐づいていない場合、手動マクロを起動し、「今選択されているモノ」の情報を取り出す



○方法1の具体的な展開の基本
例えばセル範囲の場合:
選択さ...続きを読む

QofficeXP Excel シートタブの色変更が出来るタイプと出来ないタイプ??? 

自宅も会社もofficeXPなんですが、少し違うところがあります。

エクセルで、自宅のはシートのタブが色変更できます。
シートタブ上で右クリックから色を選べます。

でも、会社のは同じXPなのに、右クリックからこの機能が出てこないのです。
これってバージョンによるものなんですか?

それとも、法人向けはこの色変更の機能を抜き取っているんですか?

どなたかわかるかたいますか?
よろしくお願いします。

Aベストアンサー

こんにちは

バージョンの違いがあるのでは、バージョンは?
検索していると2002からだとか(未確認ですが)
http://www.relief.jp/itnote/archives/002047.php

では。

Q「Debug.Print i = i + 1」がFalseになる。

Sub test()
Dim i As Long
i = 0
Debug.Print i = i + 1
End Sub
を実行すると
False
がイミディエイトウインドウに表示されます。
理由が知りたいです。
よろしくお願いします。

Aベストアンサー

Printステートメントの outputlist並びの=が、代入式ではなく比較式と評価、実行されるためでしょうね。
演算子は式のリストに含められ、算術演算子、比較演算子、論理演算子等色々ありますが、代入記号はリスト項目にはありませんので、エラーとならないのは演算子とみなしているからですね。

Print i = i + 1 の結果は、0と1の比較なのでFalse
Print i = i とすると、0と0の比較なのでTrue
Print i, i + 1の場合は、変数と数式なので 0と1
という結果になるはずです。
 

Q[EXCELマクロ] シートタブに自動で色をつけるには?

シートが、1日~31日まであり、シート内は31枚とも全て同じで、
例えば、セルA1 に、日付(平成19年7月18日と表示)があったとき、
その日付を参照して、土曜日なら青色、日曜日なら赤色、というふうに
自動で31枚全てのタブの色を変更してくれるようにしたいのですが、
可能でしょうか?
また可能であれば、どのようにマクロを組めばいいでしょうか?

Excel2003を使用しています。
よろしくお願い致します。

Aベストアンサー

全シートのセルA1に日付が入っている場合でのサンプル。

Sub test()
  Dim sh As Worksheet
  Dim hi As Integer
For Each sh In Worksheets
  With sh
     Select Case Weekday(.Range("A1").Value, vbMonday)
         Case 6
         .Tab.ColorIndex = 41
         Case 7
         .Tab.ColorIndex = 3
         Case Else
         .Tab.ColorIndex = xlColorIndexNone
     End Select
 End With
Next
End Sub
日付以外が入っている場合は、修正が必要かもしれません。
ご参考程度として下さい。

QEXCELマクロでファイル名を指定して実行.....

EXCELのマクロでファイル名を指定して実行のラインで実行するように実行をしたいのですがやり方がわかりません。ご存知のかたお教えねがえないでしょうか。

Aベストアンサー

>エクセルのsheetにコマンドボタンを作成し
これはお判かりとして
>そのコマンドボタンを押すことにより
Private Sub CommandButton1_Click()
x = Shell("C:\WINDOWS\calc.exe")
End Sub
の電卓の例をご参考に。

Q該当月のみにシートタブに自動で色

いつもお世話になります。
Win7 Excell2010 てす。

記入 顧客名簿 1 ~ 12  とシートがあります。

1)記入、顧客名簿 のシートには色付けしています。
2)1 ~ 12 は半角文字です。 (1月~12月を意味しています)

例えば、
A1 のセルに 8 と 今月は 8月ですから 8のシートタブに自動的色付けさせたいのですが可能でしょうか。
いろんなサイトで検索しましたが見つけることができませんてした。
VBAの記述と思いますがもし可能ならご指導いただけませんか。

Aベストアンサー

例として。

Dim sh As Worksheet
    For Each sh In Worksheets
        If sh.Name = Month(Now) Then
            sh.Tab.Color = 255    ' 赤
        Else
            sh.Tab.ColorIndex = xlNone
        End If
    Next

これを「開く時」イベントに書いておくと、
おそらくお望みの
・該当月の見出しは「赤」
・それ以外の見出しは「無色」
に出来ます。

VBAの使い方は別途お調べくださいませ。

QエクセルVBAでShapeRange.Fill.Solidって?

オートシェープの書式設定で、

Selection.ShapeRange.Fill.Visible = msoTrue
Selection.ShapeRange.Fill.Solid Selection.ShapeRange.Fill.ForeColor.SchemeColor = 55
Selection.ShapeRange.Fill.Transparency = 0.1

等、いろいろありますが、
このうちShapeRange.Fill.Solidとはどこの部分のどういう設定なのでしょうか?ここだけは意味が分かりません。

Aベストアンサー

merlionXX さん、こんばんは。
Wendy02です。

Solid というのは、パターンなどが入っていない種類の塗りつぶしのことです。

No. 1974619 の件ですが、私も、以前、同じような経験があります。merlionXXさんのコードは、コード的には、正解だと思います。

ただ、ひとつだけ、経験的に、

 .ShapeRange.Fill.Visible = msoTrue

を入れないと、失敗することがあるようなのですね。同様の例がいくつかあるようです。
それと、Solid やTransparencyのプロパティも念のために入れておいたほうがよいようです。

つまり、相手の環境で、どのように設定が残っているか分らない場合は、念のため、というのは、重要なことなのですね。(と、前回の轍を踏まないように自分に言い聞かせています。(^^ゞ そういう私は、良く失敗するのですね。)

以前、merlionXX さんが、ご質問なさった、オートシェイプは、いくつまでできるか、という話の延長みたいなところに、この問題があるようなんです。たぶん、オートシェイプが眠ってしまうのか、数をこなすと、反応しなくなるようなのですね。(良く分りません)

私のワークシートでは、No. 1974619のmerlionXX さんのコードは、何の問題もありませでしたが。

merlionXX さん、こんばんは。
Wendy02です。

Solid というのは、パターンなどが入っていない種類の塗りつぶしのことです。

No. 1974619 の件ですが、私も、以前、同じような経験があります。merlionXXさんのコードは、コード的には、正解だと思います。

ただ、ひとつだけ、経験的に、

 .ShapeRange.Fill.Visible = msoTrue

を入れないと、失敗することがあるようなのですね。同様の例がいくつかあるようです。
それと、Solid やTransparencyのプロパティも念のために入れておいたほうがよいよ...続きを読む

QEXCELシートのタブの色

EXCELでシート(初期設定でsheet1とかsheet2とか)の色が変えられたと思ったんですけどやり方を忘れてしまいました。
教えてくださ~い!

Aベストアンサー

こんにちは。maruru01です。

一応、2000以前での方法を載せてあるページです。
裏技的なので、おすすめしませんが。

http://xcelfiles.homestead.com/Excel01_J.html#anchor_14133

参考URL:http://xcelfiles.homestead.com/Excel01_J.html#anchor_14133

Q条件に一致しない行を全て削除した場合「ActiveSheet.ShowAllData」がエラーになる

条件に一致しない行を全て削除し、フィルタモードを解除したいのですが
エラーになってしまいます。
下記のコードを実行して
1つでも条件と一致する「あああ」があれば
ActiveSheet.ShowAllData
を実行してフィルタの解除ができるのですが
「あああ」がない時は
「実行時エラー1004 workSheetクラスのShowAllDataメソッドが失敗しました。」
となってしまいます。

Selection.AutoFilter Field:=1, Criteria1:="<>あああ" 'あああと等しくない
Rows("2:65536").Delete
ActiveSheet.ShowAllData

そしてフィルタの青い三角マークをクリックして「すべて」を選んでも青いままです。

現在は「On Error Resume Next」で対応していますが、VBAでちゃんと処理する方法はないでしょうか?

Aベストアンサー

こんばんは。

こんな感じになるかと思います。

Sub Test1()
  With ActiveSheet
    .Range("A1").CurrentRegion.AutoFilter _
    Field:=1, Criteria1:="=あああ"  'あああと等しくない
    If WorksheetFunction.Subtotal(3, .AutoFilter.Range.Columns(1)) > 1 Then
      Application.DisplayAlerts = False
      With .AutoFilter.Range
        .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Delete
      End With
      Application.DisplayAlerts = True
    End If
    .ShowAllData 'すべての表示 (▼が残ります)
    .AutoFilterMode = False 'フィルタの解除
  End With
End Sub

こんばんは。

こんな感じになるかと思います。

Sub Test1()
  With ActiveSheet
    .Range("A1").CurrentRegion.AutoFilter _
    Field:=1, Criteria1:="=あああ"  'あああと等しくない
    If WorksheetFunction.Subtotal(3, .AutoFilter.Range.Columns(1)) > 1 Then
      Application.DisplayAlerts = False
      With .AutoFilter.Range
        .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Delete
      End With
  ...続きを読む


人気Q&Aランキング

おすすめ情報