VBAの書き方を教えてください

このQ&Aのポイント
  • 以前にこちらで質問をさせていただき、VBAを追記する方法について教えていただきましたが、移動したシートをアクティブにする方法がわかりません。
  • 移動したシートのA1000をアクティブにするために、どこに何を入れればよいのでしょうか?
  • よろしくお願いします。
回答を見る
  • ベストアンサー

VBAの書き方を教えてください 2

以前にこちらで質問をさせて頂き、(http://okwave.jp/qa/q8451754.html)これに、VBAを追記していきたいのですが、移動したシートがアクティブする方法がわかりません。 移動したシートのA1000をアクティブにする場合、教えて頂いたVBAにどこに何を入れれば宜しいのでしょうか? よろしくお願いします。 Private Sub CommandButton1_Click() Dim k As Long, myFlg As Boolean For k = 1 To Worksheets.Count If Worksheets(k).Name = Range("A1") Then myFlg = True Exit For End If Next k If myFlg = True Then Worksheets(k).Activate Else MsgBox "該当シートなし" End If End Sub

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

  • ベストアンサー
回答No.3

もう、おおよその正解はついているので、あえて回答する必要もないとは思いますが、 あえて、元のコードを直すなら、 '// Private Sub CommandButton1_Click()  Dim i As Long  Dim myFlg As Boolean  For i = 1 To Worksheets.Count   If Worksheets(i).Name = Range("A1").Value Then '* 加筆    myFlg = True    Exit For   End If  Next i  If myFlg = True Then   With Worksheets(i)    .Activate    .Range("A1000").Select '* 加筆   End With  Else   MsgBox "該当シートなし"  End If End Sub '// 確かに、ループよりは、Goto のほうがよいでしょうが、私なら、回答として、このようなコードを書きます。ただし、実務上は、私は、違うコードを書きます。あまり、Error トラップを置き過ぎると、コードが読みにくくなりますから、実務では、Errorが分かる範囲の場合は、トラップは置かない場合が多いです。 '// Private Sub CommandButton1_Click()  Dim wsName As String  If Range("A1").Value <> "" Then   wsName = Range("A1").Value   On Error Resume Next   Application.Goto Worksheets(wsName).Range("A1000"), True  End If  If Err.Number <> 0 Then    MsgBox Err.Description, vbCritical    wsName = "" 'もしも、この後のコード加える場合は、これを書いておいたほうが無難です。  End If End Sub '//

t-seisan1
質問者

お礼

windFallerさん。 ありがとうございます。 大量に元のコードを書き込んでいた物ですから、修正するのが大変なので元の教えて頂いたのをベースにしたかったのです。 せっかく教えて頂いたのですが、違うコードは自分には理解しきれませんでしたので、上記を使う事にしました。 また何かあればよろしくお願いいたします。

その他の回答 (3)

回答No.4

AN1です。訂正します。 原因が分かりました。アクティブでないシートのセルを直接selectやactivate出来ません。 なので一旦シートを選択してからセルをアクティブにします。 If myFlg = True Then Worksheets(k).select Range("A1000").Activate Else これでOKです。間違ってたらごめんなさい。

t-seisan1
質問者

お礼

over the galaxyさん。 ありがとうございます。 すみません、自分もシートを選択してからセルを指定する方法を考えていたのですが、うまくいかなかったので、こちらに質問させていただいていました。 やはり、教えて頂いたのではアクティブシートは、移動先ではなく元のシートになってしましました。 また、何かあればよろしくお願いいたします。

回答No.2

If myFlg = True Then Worksheets(k).Range("A1000").Activate Else で出来ると思います。

t-seisan1
質問者

補足

おはようございます。 実行時エラー1004 RangeクラスのActivateが失敗しました。 が発生してしまいます。 何とかなりますでしょうか?

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

private sub CommandButton1_Click()  on error resume next  application.goto worksheets(range("A1").value).range("A1000"), true end sub でいいです。

t-seisan1
質問者

お礼

keithinさん。 早急な回答ありがとうございました。 教えて頂いた内容で実行できたのですが、使う者が全くの素人なのでどうしてもエラー文面が必要でした。 また、何かあればよろしくお願いいたします。

関連するQ&A

  • VBAで教えて下さい。続き

    昨日VBAの事で質問し回答を頂いたのですが追加で質問があります。ベストアンサーを選ぶと質問は締め切られる事を知らずにお礼をしたら終わってしまっていました。どなたか宜しくお願い致します。 最初の質問は 表を作りたいのですが、 顧客名のシートを100枚ほど作り、シート1(シート1は検索シートにしたいので顧客名は無)のA1にクライアント名を入力したら入力した顧客名シートが出てくる様にしたいです。 以上が最初の質問です。 以下の書式がベストアンサーに選らばせて頂いた方の回答です。 これで動くようになったのですが、 追加で シートのC1に顧客のID数字が7ケタあるのですが、顧客名シート検索かID検索どちらかで一方入力した場合のコードとかは教えて頂いたコードに足せば可能ですか? というのが質問です。 宜しくお願い致します。 Private Sub Worksheet_Change(ByVal Target As Range) Dim k As Long, str As String, myFlg As Boolean str = Range("A1") For k = 1 To Worksheets.Count If Worksheets(k).Name = str Then myFlg = True Exit For End If Next k If myFlg = True Then Worksheets(str).Activate Else MsgBox "該当シートなし" End If End Sub

  • VBAの書き方を教えてください 3

    何度も申し訳ございません。 以前にもこちらで質問させて頂いている者です。 Sheet1のrange("A1")をVLOOKUPで検索後の文字を取得し、同じ名前のシートを検索し、さらにrange("A1000")をアクティブにしてここからコードをつなげて処理しています。 range("A1")の処理が終わったら、range("A2")の処理に入り、range("A3") range("A4")を続けて処理を行っているのですが、range("A4")でVLOOKUPの検索が空白の場合、On Error GoTo myErrorで次のrange("A5")の処理に入りますが、On Error Gotoは1回のみの処理しかできないみたいで、range("A5")が空白の場合、実行時エラー9が発生してしまいます。 教えて頂いたコードを解読し、On Error Resume Nextなどを使おうとしているのですが、上手くできません。 1から10まで質問しっぱなしなのですが、どなたかご協力を頂けないでしょうか。 とりあえず自分の必要なコードはある程度省いて、2つ分のみ記載します。 本来この後、10回同じ処理を行います。 よろしくお願い致します。 Private Sub 記帳_Click()  On Error GoTo myError1  Dim i As Long  Dim myFlg As Boolean    For i = 1 To worksheets.Count If worksheets(i).Name = Range("A1").Value Then myFlg = True Exit For End If Next i If myFlg = True Then With worksheets(i) .Activate .Range("A1000").End(xlUp).Select    ActiveCell.Offset(1, 0).Select   ActiveCell = Range("J1") ActiveCell.Offset(0, 1).Select ActiveCell = Range("K1") End With Else MsgBox "該当シートなし" End If myError1: On Error GoTo myError2 For i = 1 To worksheets.Count If worksheets(i).Name = Range("A2").Value Then myFlg = True Exit For End If Next i If myFlg = True Then With worksheets(i) .Activate .Range("A1000").End(xlUp).Select ActiveCell.Offset(1, 0).Select   ActiveCell = Range("J1") ActiveCell.Offset(0, 1).Select ActiveCell = Range("K1") End With Else MsgBox "該当シートなし" End If End sub

  • VBA

    下記に、ツールバーにある印刷ボタンを押すとチェックBOXがチェックされていない時印刷できないようにするというVBAですが下のVBAのような感じで 例えばセルA1にFALSEという文字が入っていたら印刷不可で印刷するかしないかを選択。もし、セルA1にTRUEという文字が入っていたら印刷可。 というのをVBA教えて下さい。 よろしくお願いします。 Private Sub Workbook_BeforePrint(Cancel As Boolean)   With Worksheets("sheet1").CheckBoxes("チェック 1")     If .Value <> 1 Then      If MsgBox("印刷しますか?", vbYesNo) <> 6 Then Cancel = True      End If     End With End Sub

  • エクセルVBAについて教えてください

    エクセル2003です。 Sheet1     A    B    C     D 1 種類1 商品1 商品A  商品あ 2 種類2 商品2 商品B  商品い 3 種類3 商品3 商品C  商品う  4      商品4 商品D  商品え 5  商品5 商品E  商品お Sheet2   AB CDF     G    H     I 1         種類表示     商品表示  2         種類表示     商品表示  3         種類表示     商品表示  4         種類表示     商品表示  5         種類表示     商品表示  *Sheet2のG1をダブルクリックでSheet1のA列をユーザーフォームのコンボボックス1にてセルに表示  の上挿入 *コンボ1の選択によりコンボ2(Sheet2のI1をダブルクリック)の表示を変更する *コンボ1 種類1 → コンボ2 Sheet1のB列を表示の上セルに挿入 *コンボ1 種類2 → コンボ2 Sheet1のC列を表示の上セルに挿入 *コンボ1 種類3 → コンボ2 Sheet1のD列を表示の上セルに挿入 までは、出来きたのですが、Sheet2の2行目以降も同作業をしたいのですが、、、 Offset等を使用するのでしょうか? あまりわかっていないので詳しく教えて頂ければ幸いです コード Sheet2のコード Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Cancel = True With Target If .Address = "$F$1" Then UserForm1.Show ElseIf .Address = "$H$1" Then Dim k As Long, myFlg As Boolean, myArray myArray = Array("種類1", "種類2", "種類3") myFlg = False For k = 0 To UBound(myArray) If Range("F1") = myArray(k) Then myFlg = True End If Next k If myFlg = False Or Range("F1") = "" Then MsgBox "種類を選択して", vbOKOnly Range("F1").Select Exit Sub End If UserForm2.Show End If End With End Sub ユーザーフォーム1のコード Private Sub UserForm_Initialize() ComboBox1.RowSource = "sHEET1!A1:A3" End Sub コンボ1のコード Private Sub ComboBox1_Change() Worksheets("Sheet2").Range("F1") = UserForm1.ComboBox1.Text Worksheets("Sheet2").Range("H1") = "" Unload Me End Sub ユーザーフォーム2のコード Private Sub UserForm_Initialize() With UserForm2.ComboBox1 Select Case Worksheets("Sheet2").Range("F1") Case "種類1" .RowSource = "Sheet1!B1:B5" Case "種類2" .RowSource = "Sheet1!C1:C5" Case "種類3" .RowSource = "Sheet1!D2:D5" End Select End With End Sub コンボ2のコード Private Sub ComboBox1_Change() Worksheets("Sheet2").Range("H1") = UserForm2.ComboBox1.Text Unload Me End Sub このコードをいじくってSheet2以降も同作業できるようにお願いします

  • 印刷後のVBAの実行 (3)

    Private Sub Workbook_BeforePrint(Cancel As Boolean) If ActiveSheet.Name = "Sheet1" Then If Range("D6").Value = "" Then Cancel = True MsgBox ("名前を入力してください") Range("D6").Select Exit Sub End If Else If ActiveSheet.Name = "Sheet2" Then If Range("C11").Value = "" Then Cancel = True MsgBox ("受付時間を入力してください") Range("C11").Select Exit Sub End If Else Exit Sub End If End If If Worksheets("Sheet1").Range("D5") = "不要" Then GoTo P1 ActiveSheet.Range("A70:Y70").Copy If Worksheets("Sheet3").Range("A1").Value = "" Then Worksheets("Sheet3").Range("A1").PasteSpecial Paste:=xlPasteValues Else Worksheets("Sheet3").Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial _ Paste:=xlPasteValues End If Application.CutCopyMode = False P1: ActiveSheet.Range("A1").Select End Sub sheet1のD5に「不要」と入っていたら 24~33行目の作業がキャンセルになりますが sheet2のD5にも「不要」と入っていたら、同じ様にキャンセルできる様に出来ますでしょうか? ご回答お願いします

  • どこが間違ってますか? (エクセルVBAです)

    質問をご覧くださりありがとうございます。 どなたか助けていただけないでしょうか。 以下のコードの場合、B2セルをダブルクリックすればシート(1)が開くと思っていたのですが、B2以外のセルをダブルクリックしてもシート(1)が開いてしまいます。 どこが悪いのでしょうか。 詳しい方がいらっしゃいましたら、どうか教えてください。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, cancel As Boolean) If Target = Range("B2") Then cancel = True Worksheets("シート(1)").Activate End If End Sub どうか、宜しくお願いいたします。

  • VBAで指定したSheetの削除

    お世話になります 指定したシート以外すべてのシートを削除させるボタンを作成したいのですが ↓こんなものを見つけました。(URLわからくなってしまった;;) これは図1~ワークシートを削除させるVBAらしいのですが ■解らないこと なぜかsheetにすると削除してくれません。 '指定以外ワークシート削除 Private Sub CommandButton1_Click() Dim myShe As Worksheet For Each myShe In Worksheets If myShe.Name <> Worksheets("図").Name Then myShe.Visible = Delete End If Next End Sub

  • VBA チェックした項目以外を非表示

    現在下記のようなコードがあります。 C列に項目が入力されており そのC列に入力されている項目と同じ文字が ユーザーフォームのチェックボックスのキャプションになっています。 今回やりたいのはチェックボックスにチェックした項目以外を 非表示にしたいというものですが 現状は、1つだけのチェックなら正常に機能します。 2つ以上チェックしてしまうとオブジェクト名が大きい方が優先されて しまい1つだけの項目しか表示されません。 どのようにコードを書き換えればよろしいでしょうか? Private Sub CommandButton1_Click() Dim i As Integer Dim d As Date Dim y As Date Dim myMSG As String Dim myFlg As Boolean Dim rng As Range Dim rng2 As Range myFlg = False For i = 1 To 14 If Me.Controls("CheckBox" & i).Value = True Then myMSG = Me.Controls("CheckBox" & i).Caption myFlg = True End If Next i If myFlg = False Then GoTo Label1 End If Set rng2 = Range("C:C").Find(what:=myMSG, lookat:=xlWhole) If rng2 Is Nothing Then MsgBox Me.ComboBox1 & "日に" & myMSG & "は使用していません。", vbInformation Exit Sub Else For x = 2 To Range("C65536").End(xlUp).Row If Range("C" & x).Value <> myMSG Then Rows(x & ":" & x).EntireRow.Hidden = True End If Next x End If End Sub

  • エクセル VBA for文について

    再び失礼します。 昨日VBAを始めた初心者です。 1、チェックボタン17個にそれぞれ変数を設定 2、2つだけチェックを入れると仮定して、実行ボタンを押したときに チェックが入っている2つの中で変数の大きいものをMax、小さいものをMinとしてシートに出力したいのですが、”ここ”と書いてあるところに Me("hensuu" & n). hensuu & n など入れてみたのですがエラーになります。 くだらないミスだと思いますがよくわかりません。 どなたかご教授お願いします。 Private Sub CommandButton2_Click() If Check1.Value = True Then hensuu1 = "9" End If If Check2.Value = True Then hensuu2 = "8" End If If Check3.Value = True Then hensuu3 = "7" End If If Check4.Value = True Then hensuu4 = "6" End If If Check5.Value = True Then hensuu5 = "5" End If If Check6.Value = True Then hensuu6 = "4" End If If Check7.Value = True Then hensuu7 = "3" End If If Check8.Value = True Then hensuu8 = "2" End If If Check9.Value = True Then hensuu9 = "1" End If If Check11.Value = True Then hensuu10 = "1/2" End If If Check11.Value = True Then hensuu11 = "1/3" End If If Check12.Value = True Then hensuu12 = "1/4" End If If Check13.Value = True Then hensuu13 = "1/5" End If If Check14.Value = True Then hensuu14 = "1/6" End If If Check15.Value = True Then hensuu15 = "1/7" End If If Check16.Value = True Then hensuu16 = "1/8" End If If Check14.Value = True Then hensuu17 = "1/9" End If Dim n As Long Dim Max As Long Dim Min As Long For n = 1 To 17 If Me("Check" & n).Value = True Then Max = ”ここ” If Me("Check" & n).Value = True Then Exit For Next n For n = Max To 17 If Me("Check" & n).Value = True Then Min = ”ここ” If Me("Check" & n).Value = True Then Exit For Next n Worksheets("Sheet1").Range("A1") = Min Worksheets("Sheet1").Range("B1") = Max MsgBox hensuu End Sub

  • 印刷後のVBAの実行 (2)

    Private Sub Workbook_BeforePrint(Cancel As Boolean)   If ActiveSheet.Name = "Sheet1" Then     If Range("D6").Value = "" Then       Cancel = True       MsgBox ("名前を入力してください")       Range("D6").Select       Exit Sub     End If   Else     If ActiveSheet.Name = "Sheet2" Then       If Range("C11").Value = "" Then         Cancel = True         MsgBox ("受付時間を入力してください")         Range("C11").Select         Exit Sub       End If     Else              Exit Sub     End If   End If   ActiveSheet.Range("A70:Y70").Copy   If Worksheets("Sheet3").Range("A1").Value = "" Then     Worksheets("Sheet3").Range("A1").PasteSpecial Paste:=xlPasteValues   Else     Worksheets("Sheet3").Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial _       Paste:=xlPasteValues   End If   Application.CutCopyMode = False   ActiveSheet.Range("A1").Select End Sub 先日、上記のコードを回答者の方から教えてもらい、とても助かっていますが sheet1のD5に「不要」という文字が入っていた場合、 sheet3への貼り付け(23~30行目の作業)をキャンセルして、最後にsheet1のA1を選択するようにはどの様にしたらいいでしょうか?

専門家に質問してみよう