• ベストアンサー

エクセルVBAで

いつもお世話になります。 Sub ボタン_Click() Sheets("別紙1").Range("E1") = ActiveSheet.Name Sheets("別紙1").Activate Range("B65536").End(xlUp).Offset(1).Select End Sub Sub ボタン1_Click() i = Range("B65536").End(xlUp).Offset(, -1).Value na = Range("E1") Sheets(na).Activate ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", _ SubAddress:="別紙1!B" & i + 2, TextToDisplay:=Str(i) End Sub 上記モジュールで、ボタンをクリックすると別紙1に飛んで、その中に必要事項を記入後、ボタン1をクリックすると、ボタンをクリックしたときにアクティブだったセルに、ハイパーリンクを貼るものを利用していました。 先日、これらモジュールが貼られているシートを保護をかけて再度保護を解除したら、今までボタンを押したときにアクティブだったセルにハイパーリンクが貼れていたのに、A1のセルに記入してしまうようになりました。 そこで、不具合を改善すべく、上記モジュールを書き換えて、ボタンをクリック時にアクティブセルを別紙1のE2の保存しておいて、ボタン1をクリックするとそのE2のセルに戻ってハイパーリンクを貼るというものにしなおしたいと思います。 そこで質問ですが、ボタンをクリックした時点で、アクティブであるセルの座標(表現の方法が不適切かもしれませんが)を取得するにはどのようにすればいいでしょうか? ちなみに、E1にはクリックした時点でアクティブであるシート名を記録し、ボタン1をクリックしたときにそのシートへ戻るようにしてあります。 以上、ご教示の程よろしくお願いします。

  • nkeis
  • お礼率57% (86/150)

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

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

>アクティブであるセルの座標(表現の方法が不適切かもしれませんが)を取得するにはどのようにすればいいでしょうか? 座標を取得して何をされるのか良く理解しないまま書きますが、次のような方法が考えられます。 Dim ActROW, ActCOL as long ActROW = ActiveCell.Row '行番号取得 ActCOL = ActiveCell.Column '列番号取得 Cells(ActROW , ActCOL).Select Dim ADRS As String ADRS=ActiveCell.Address 'セルアドレス取得 Range(ADRS).select Dim RNG as Range Set RNG = ActiveCell 'レンジオブジェクトを退避 RNG.Select

nkeis
質問者

補足

ご教示ありがとうございます。 VB初心者のため、説明及びモジュールの形成が適切ではないかもしれませんが、ADRS=ActiveCell.Address が知りたかったのです。 ありがとうございました。

その他の回答 (3)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.4

こういう事かな? ’呼び出し元のセルを記録しておくモジュールレベル変数 Private m_rPrevious As Range Sub ボタン_Click()   ' 現在のアクティブセルをモジュールレベル変数で参照しておきます   Set m_rPrevious = ActiveCell   ' シート[別紙1]のB列のデータ書き込み先へ飛びます   With ThisWorkbook.Sheets("別紙1")     .Activate     .Cells(Rows.Count, "B").End(xlUp).Offset(1).Select   End With End Sub Sub ボタン1_Click()   Dim i      As Variant   Dim rLast    As Range   Dim sDispText  As String   ' 終了条件:: 呼び出し元のセルが参照されてない   If m_rPrevious Is Nothing Then Exit Sub   ' 現在アクティブなシートの B 列データ最終行のセルを参照   Set rLast = Cells(Rows.Count, "B").End(xlUp)   ' rLast のひとつ左(ここでは A列)の値が空ならリンク表示文字列に   ' アドレスを、空でなければ値を変数にしまっておく   With rLast.Offset(0, -1)     If IsEmpty(.Value) Then       sDispText = .Address     Else       sDispText = .Value     End If   End With   With m_rPrevious.Parent     ' ジャンプ元のシートをアクティブに     .Activate     ' リンクを貼ります     .Hyperlinks.Add Anchor:=m_rPrevious, _             Address:="", _             SubAddress:=rLast.Parent.Name & "!" & rLast.Address, _             TextToDisplay:=sDispText   End With      ' 次回の誤動作防止のため参照を開放します   Set rLast = Nothing   Set m_rPrevious = Nothing End Sub

nkeis
質問者

補足

ありがとうございます。せっかくのご教示いただきましたが、ADRS=ActiveCell.Address でうまくできました。ありがとうございました。 不十分な説明にも関わらず、たくさん考えていただき大変感謝しております。ありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 私には、ご質問が理解できません。コードが分からないです。 何をされているのか、もう一度説明していただきたいです。今まで、行ってきた過程や結果よりも、目的をはっきりして提示していただきたいです。 それと、シートの保護自体は、マクロで開け閉めするか、Protect メソッドで、UserInterfaceOnly をTrue にしておいて、マクロを有効にすればよいだけだと思います。設定によっては、シートの保護とマクロは別です。 >ボタン1をクリックすると、 >ボタンをクリックしたときにアクティブだったセルに、ハイパーリンクを貼る ハイパーリンクをどこにつけるのでしょうか?別紙1 ではないようですね。なぜ、別紙1のB列にリンクを貼るのとか、良く分かりません。別紙1のB列には何があるのか分かりません。Sheet名? フォームボタンをお使いのようですが、フォームで使う分には、シートは特定されているはずです。 それと、アクティブだったセルという過去形の意味が分かりません。 >アクティブであるセルの座標(表現の方法が不適切かもしれませんが)を取得するにはどのようにすればいいでしょうか? ハイパリンクに使用するSubAddressなら、 ActiveSheet.Name & "!" & ActiveCell.Address(0, 0) ということになるとは思いますが。

回答No.2

Selection.Addressでは取得できませんか?

nkeis
質問者

補足

ありがとうございます。せっかくのご教示いただきましたが、ADRS=ActiveCell.Address でうまくできました。ありがとうございました。

関連するQ&A

  • No2046218のカスタムなのですが

    いつもお世話になります。 以前、No2046218にて質問させていただき、この機能にはとても満足しています。 このたび別の仕事で、簡易地図検索をつくろうと思い、以前ご教授いただいたこの機能をカスタムできないかと考えた次第です。 そのときおしえていただいたモジュールは、 Sub ボタン_Click() Sheets("別紙1").Range("E1") = ActiveSheet.Name Sheets("別紙1").Activate Range("B65536").End(xlUp).Offset(1).Select End Sub Sub ボタン1_Click() i = Range("B65536").End(xlUp).Offset(, -1).Value na = Range("E1") Sheets(na).Activate ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", _ SubAddress:="別紙1!B" & i + 2, TextToDisplay:=Str(i) End Sub で、自動採番式のハイパーリンクです。 この機能は、セルを選択してボタンをクリックすると、サブシートの一覧にとび、ボタン1をクリックすると元のシートに戻り、ハイパーリンクをつなげるといったものですが、この機能を、セルではなくて、オートシェイプとリンクしたいと思います。 そこで、シート上に画像の地図を貼り付け、マクロでオートシェイプを発生させて、そのオートシェイプとサブシートの一覧(住所録)をハイパーリンクでつなげたいと思っています。 よって手順は、ボタンを押してオートシェイプを発生させて、サブシートにとび必要事項を記入してボタン1を押すと元のシートに戻った時点で、ハイパーリンクが出来ているというものです。 はじめにオートシェイプを発生させたときに、その中に任意のテキストを入力できるようになるとさらにありがたいです。 よろしくご教示いただきますようお願い致します。

  • エクセルVBA の変数を使うべきでしょうか?

    はじめまして。エクセル初心者です。 書籍やサイトで勉強させてもらっていますが、VBAがなかなか難しくてすぐに壁にぶつかってしまいます。少々困ってしまい、詳しい方のアドバイスを頂ければと質問を投稿させていただきました。 どうか宜しくお願い致します。質問ですが、 以下のようなコードで、sheet5のB列の任意のセルをダブルクリックした場合、sheet5のBCD列の同じ行のセル値がsheet1の指定した列に入力されるという処理を作りました。 これで一応目的の動作はするのですが、数が増えると「コンパイルエラー・プロシージャが大きすぎます」というメッセージがでてしまいます。列や行には規則性があるので、もしかしたら変数というものを使ってコードを書き直せばいいのかなと思いネットで調べてみたのですが、今のところさっぱり理解できません。 申し訳ありませんが、分かりやすくご教授いただけないでしょうか。バージョンは2003を使っています。 また、下のコードですと、sheet5のBCDいずれかのセルに空白があった場合、sheet1の列に入力されるときに入力される行がずれてしまいます。今は空白を何かで埋めて対処しているのですが、この問題の解決策も教えて頂けると助かります。どうか宜しくお願い致します。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Target.Address = "$B$2" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B2") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C2") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D2") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$3" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B3") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C3") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D3") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$4" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B4") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C4") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D4") Worksheets("sheet1").Activate cancel = True End If   ・     ・   ・     ・   ・     ・ End Sub

  • VBAでセルのコピーをすると、エラーになる

    =IF(COUNTIF('5月'!B4:I13,E13)=0,"",COUNTIF('5月'!I:I,E13))というセルを コピーして、別のシートのセルに貼り付けたのですが、値が「0」の場合「””」が セルに張り付いてしまい、その後の計算ができません。 「””」を本当の空欄にするにはどうしたらいいのでしょうか? Sub 転記() Dim sh1 As Worksheet Dim sh2 As Worksheet Dim SN As String SN = Month(Now()) Set sh1 = Sheets(SN) Set sh2 = Sheets("差出票") sh1.Range("A35").End(xlUp).Offset(1) = sh2.Range("B9") sh1.Range("A35").End(xlUp).Offset(0, 1) = sh2.Range("F13") sh1.Range("A35").End(xlUp).Offset(0, 2) = sh2.Range("F14") sh1.Range("A35").End(xlUp).Offset(0, 3) = sh2.Range("F15") sh1.Range("A35").End(xlUp).Offset(0, 4) = sh2.Range("F16") sh1.Range("A35").End(xlUp).Offset(0, 5) = sh2.Range("F17") sh1.Range("A35").End(xlUp).Offset(0, 6) = sh2.Range("F18") sh1.Range("A35").End(xlUp).Offset(0, 7) = sh2.Range("F19") End Sub

  • VBAのWorkbook_BeforeSaveイベントについての疑問

    エクセル2000です。 前にも似たような質問をしたのですが理解ができていません。 ThisWorkbookモジュールに以下の記述をし、終了時保存する場合にはSheet2を表に出すようにしました。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Sheets("Sheet1").Range("A65536").End(xlUp).Offset(1).Value = Time() Sheets("Sheet2").Select MsgBox "保存します。" & ActiveSheet.Name Sheets("Sheet1").Range("B65536").End(xlUp).Offset(1).Value = Time() End Sub これで×を押して手動で終了すればそのとおりに働きます。ActiveSheet.Nameも当然Sheet2になります。 ところが、標準モジュールの下記の終了マクロ Sub 終了() ThisWorkbook.Close End Sub で終了しようとすると、A列セルにTime()は記録され、どういうわけかSheet2がSelectされず、MsgBox "保存します。" のメッセージが出て、B列セルにTime()が記録され、保存されます。 ActiveSheet.NameもSheet2ではありません。 つまり、Sheets("Sheet2").Select の部分だけが完全にスキップされてしまうのです。 どうしてでしょうか?

  • VBAについて

    いつもお世話になっています マクロ・VBA超初心者です。 質問させてください。 現在シート1の完売のセルの欄に○が入っていれば日付をみてシート2の同じ日付の隣のセルに○を入力しようと思っているのですが、シート2の日付を検索はしているんですが入力がいきません Sheet1  ↓セルA1 ↓セルB1  5月26日   26           B1のセルはDAY(A1)にて出してます         完売  A氏     ○             Sheet2  ↓A列   ↓B列 5月  1日  ・  ・  ・  26日    ○           ←シート1の所に○が付いているとシート1セルB1と同じ  27日                  日付の隣のセルに○を入力  28日 VBA Sub test() Sheets("Sheet2").Select Range("A1").Select Do Until ActiveCell = "" ActiveCell.Offset(1, 0).Activate If ActiveCell.Value = Worksheets("Sheet1").Range("B2") Then ActiveCell.Offset(0, 1).Activate If ActiveCell.Value <> "○" Then ActiveCell.Valu = "○" ActiveCell.Offset(0, -1).Activate Else ActiveCell.Offset(0, -1).Activate End If Else End If Loop Sheets("Sheet2").Select Range("A1").Select End Sub どこが間違っているかわからない状態です。 分かりにくい説明ではあるんですが教えてください お願いします。

  • excel vba のエラー原因が分かりません

    データ入力シート「Hit Data] データ表示シート「User Sheet」 とあります。 データ表示シート「User Sheet」に「次へ」「前へ」「最初へ」「最後へ」とボタンをつくり、データ入力シート「Hit Data]から、都度データを呼び出せるようにするプログラムをとあるサイトを参考にして作成しましたが、エラーが出てしまいどうしてもうまくいきません。 どこに問題があるのか見ていただけないでしょうか? '以下標準モジュールのプログラムです Public trg As Range Sub Saisyo()  Set trg = Worksheets("Hit Data").Range("A3")  Call Tenki End Sub Sub Saigo()  Set trg = Worksheets("Hit Data").Range("A60000").End(xlUp)  Call Tenki End Sub Sub Mae()  If trg.Row >= 4 Then   Set trg = trg.Offset(-1, 0)   Call Tenki  Else   MsgBox "これより前のレコードはありません"  End If End Sub Sub Tsugi()  If trg.Row < Worksheets("Hit Data").Range("A60000").End(xlUp).Row Then   Set trg = trg.Offset(1, 0)   Call Tenki  Else   MsgBox "これより後ろのレコードはありません"  End If End Sub Sub Tenki()  Worksheets("User Sheet").Range("D9").Value = trg.Offset(0, 0)  Worksheets("User Sheet").Range("D10").Value = trg.Offset(0, 1)  Worksheets("User Sheet").Range("D11").Value = trg.Offset(0, 2)  Worksheets("User Sheet").Range("D12").Value = trg.Offset(0, 3) End Sub '以下 User Sheet"のシートモジュールに記載されたプログラムです。 Private Sub Worksheet_Activate() Call Saisyo End Sub '表示されるエラーの内容 'saisyo・・・アプリケーション定義またはオブジェクト定義のエラーです。 'saigo・・・同上 'mae・・・オブジェクト変数またはWithブロック変数が設定されていません 'tugi・・・同上

  • コマンドボタンを押したときシート2のa行の空白セルを選択したいのですが

    コマンドボタンを押したときシート2のa行の空白セルを選択したいのですが以下のやり方では”RangeクラスのSelectメソッドが失敗しました。”のエラーが出てしまいます。どこがいけないのか教えてください。 Private Sub CommandButton1_Click() Worksheets("sheet2").Activate Range("a65536").End(xlUp).Offset(1).Select End Sub ちなみに、コマンドボタンはシート1にあります。 よろしくお願いします。

  • Excel VBAについて

    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Intersect(Target, Range("F:F")) Is Nothing Then Exit Sub Application.Goto Worksheets("人件費").Range("A1") Worksheets("人件費").Cells(Rows.Count, "A").End(xlUp).Offset(1).Value = Target.Offset(, -5).Value cancel = True End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Intersect(Target, Range("G:G")) Is Nothing Then Exit Sub Application.Goto Worksheets("外注費").Range("A1") Worksheets("外注費").Cells(Rows.Count, "A").End(xlUp).Offset(1).Value = Target.Offset(, -5).Value cancel = True End Sub 上の指令はFの列をダブルクリックすると人件費のシートが開いてAある値を人件費の新しいセルのAに代入する指令ですが それをG列ダブルクリックで外注費シートに同じようにやろうと思いましたが出来ません。 たぶん根本的に書き方が間違っているのかと思われますが、ご指導のほどお願いします。

  • 既存のマクロを他のエクセルファイルで使用したい

    下記のマクロを使おうと思うと、 このマクロがついたファイルを開いて 他のエクセルファイルを開くのですが使えません。 使おうとするとマクロのついたファイルに戻ってしまいます。 Sub test01() Dim ws As Worksheet For Each ws In Worksheets If ws.Name = "統合シート" Then Else ws.Activate d = ws.Range("A65535").End(xlUp).Row ws.Range(Cells(1, "A"), Cells(d, "C")).Copy Sheets("統合シート").Activate Sheets("統合シート").Range("A65535").End(xlUp).Offset(1, 0).Select ActiveSheet.Paste End If Next End Sub どこを変えればよいのでしょうか。 教えてください。 よろしくお願いします。

  • Excel VBAを使った重複行の抜き出しについて教えてください

    以下のような2シートから、重複する「商品番号」のあるsheet1の行を抜き出して、別シートに書き出したいと思っております。 sheet1  |  A   |  B   | C -+--------+-------+----- 1|      |      | -+--------+------+-------- 2|商品番号|商品名|責任者 -+--------+------+-------- 3|  123456|  ガム|山田太郎 -+--------+------+-------- 4| 2345678| チョコ|田中花子 ・・・ sheet2  |  A   |  B   | C -+--------+-------+----- 1|      |     | -+--------+------+-------- 2|商品番号|商品名|責任者 -+--------+------+-------- 3| 3987624|     | -+--------+------+-------- 4| 193678|      | ・・・ そこでVBAを作成したのですが、例えば商品番号「222011001」の行を抜き出したいのに、「22011001」の行も一緒に抜き出してしまいます。 どこがいけないのか、教えて頂けないでしょうか。 作成したVBAは以下の通りです。 VBA初心者で本を見ながら作ったため、大変見にくくなっているかと思います。申し訳ありませんが、どなたかおわかりになる方がいらっしゃいましたら、どうぞ宜しくお願い致します。 Option Base 1 Option Explicit Sub 重複データ抽出書き直し() Dim シート(2) As Worksheet Dim 比較列(2) As Integer Dim 一致セル As Range Dim 検索範囲 As Range Dim i As Integer Set シート(1) = Sheets("sheet1") Set シート(2) = Sheets("sheet2") 比較列(1) = 1: 比較列(2) = 1 シート(2).Activate ActiveCell.CurrentRegion.Select Selection.Offset(1, 比較列(2) - 1) _ .Resize(Selection.Rows.Count - 1, 1) _ .Select Set 検索範囲 = Selection Sheets.Add After:=Sheets(Sheets.Count) シート(1).Activate ActiveCell.CurrentRegion.Select Selection.Resize(1).Copy With Sheets(Sheets.Count).Range("A1") If Application.Version >= 9 Then .PasteSpecial 8 End If .PasteSpecial End With For i = 2 To Selection.Rows.Count Set 一致セル = 検索範囲.Find(Selection.Cells(i, 比較列(1)).Value) If Not 一致セル Is Nothing Then Selection.Offset(i - 1).Resize(1) _ .Copy Sheets(Sheets.Count) _ .Range("A65536").End(xlUp) _ .Offset(1) End If Next i Sheets(Sheets.Count).Activate End Sub

専門家に質問してみよう