Excel2000 VBA シート名の変更に関する問題

このQ&Aのポイント
  • Excel2000のVBAを使用して、UserForm1上のTextbox1とTextbox2の値を結合した文字列をアクティブなワークシートの名前に設定する方法について質問です。
  • 最初に示されたコードを実行すると、「実行時エラー’91’:オブジェクト変数またはwithブロック変数が設定されていません」というエラーが発生します。
  • ActiveWorkbook.ActiveSheet.Nameプロパティを使用する代わりに、with文を使ってActiveSheetを指定することで問題が解決する可能性があります。
回答を見る
  • ベストアンサー

Excel2000 VBA シート名の変更

なかなかうまくいかずに困っています。 Excel2000  OS:WindowsXp ユーザーフォーム(UserForm1)上に ・Textbox1 ・Textbox2 ・Commandbutton1 があります。 Commandbutton1をクリックすると、Textbox1とTextbox2の値をつなげた文字列を、 アクティブなワークシートの名前にしたいと思っています。 今現在の、うまく動かないコードは以下のとおりです。 Private Sub CommandButton1_Click() 'ユーザーフォーム上のCommandButton1 Dim snday As Variant 'Textbox1に入力される、『日』を取得するための変数 Dim snyoubi As Variant 'Textbox2に入力される『曜日』を取得するための変数 Dim namae As Variant 'シート名になる変数。 Dim Sh As Worksheet snday = UserForm1.TextBox1.Value snyoubi = UserForm1.TextBox2.Value namae = snday & snyoubi Sh.Name = namae End Sub これを実行すると、 実行時エラー’91’ オブジェクト変数または withブロック変数が設定されていません のエラーが出ます。 Sh.Name = namae のところを with ActiveSheet ~End with で挟んでみてもだめでした。 どなたかご教授ねがえませんか。 よろしくお願いいたします。

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

  • ベストアンサー
  • FEX2053
  • ベストアンサー率37% (7987/21355)
回答No.1

まずはこれ。Shって、ちゃんとシートのオブジェクトになってます? Sh.Name = namae プロさんの組むプログラムだとそうなってると思いますけど、通常は例えば Sheets("Sheet1").Name = namae ActiveSheet.Name = namae とかにすると思いますよ。 あとこれ。 Dim snday As Variant 'Textbox1に入力 なんでわざわざVariant型にするのかな。TextBoxから受けてシート名にするなら、ちゃんとString型で受けておかないと、数値と認識して変数nameが数値になっちゃうことがありますよ。ですので Dim snday As String 'Textbox1に入力 以下、Variantになってる部分をちゃんとStringなりDoubleなり、使う変数の内容をしっかり表現しておいた方がいいです。多分その2つで動くようになると思うんですが・・・。

sigeru3105
質問者

お礼

教えていただき、ありがとうございました。 VBAの知識がほとんど無く、ネットで検索したコードを、つなぎ合わせたり、 なんとなく書いてみたり、でたらめな点があるとおもいます。 正しい知識を、少しずつですが、勉強していきたいと思っています。 教えていただいた、変数の型を String にし、 削除:Sh.Name = namae 追加:ActiveSheet.Name = namae してみたら、思ったとおりのことが出来るようになりました。 ありがとうございました。

その他の回答 (1)

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.2

Shにworksheetオブジェクトが設定されていないからです。 一例ですが、Sh.Name = namae文の前にSet Sh = ActiveSheetを挿入して見て下さい。

sigeru3105
質問者

お礼

mu2011さんのコードでもできました。 ありがとうございます。 Set Sh = ActiveSheet 指定してあげる必要があるのですね。 勉強になります。 mu2011さんの投稿を確認したのは、FEX2053さんにベストアンサーをつけたあとでしたので、申し訳ありませんが、お礼入力しかできませんでした。 しかしながら、ご回答いただき、本当にありがとうございました。

関連するQ&A

  • EXCEL2003 VBA リストボックス

    お世話になります。 質問の内容についてですが、 現在VBAの勉強をしながらデータベースを組んでいます。 そこで、次のようなものを作っています。 Sheet1に於いて、     A    B     C 1  追番  名称   個数 2   1   りんご   1個 3   2   みかん  2個 4   3   なし    3個 5   4   なす    5個 というような表があるとします。 そして、VBAでフォームをつくり、TextBox1(名称入力用)、TextBox2(個数入力用)、ListBox1(すでに入力されているもの及び追加分のリスト用)、CommandButton1(入力された「名称」と「個数」をSheet1の表の一番下に追加)、CommandButton2(フォームを閉じる)という構成にしています。 また、Sheet1上にコマンドボタンを作っており、そのボタンを押すとフォームを呼出すようにしています。 流れとしては、既存の表に追加する場合、コマンドボタンを押してフォームを呼出し、テキストボックスに入力した内容をSheet1の一番下に追加する。また、フォーム上のリストボックスでも現在の表の内容を見る事ができる、というものです。 フォームでのコードは以下のようにしています。 Private Sub CommandButton1_Click() If TextBox1.Value = "" Then MsgBox "「名称」は必須項目です。" End If If TextBox2.Value = "" Then MsgBox "「個数」は必須項目です。" End If If TextBox2.Value = "0" Then MsgBox "「個数」に0は登録できません。" End If Lrow = Range("B2").CurrentRegion.Rows.Count Range("B" & Lrow + 1).Value = TextBox1.Value Range("C" & Lrow + 1).Value = TextBox2.Value End Sub Private Sub CommandButton2_Click() Unload UserForm1 End Sub Private Sub UserForm_Initialize() Dim b As Long Dim a() As String ReDim a(1 To 100) UserForm1.ListBox1.ColumnCount = 2 UserForm1.ListBox1.List = Worksheets(Sheet1).Range("B2:C").Value For i = 2 To 104 If Range("B" & i) = "" Then ListBox1.AddItem Range("B" & i).Value ListBox1.AddItem Range("c" & i).Value b = b + 1 a(b) = Range("C" & i).Value End If Next i End Sub このコードでSheet1上のコマンドボタンを押して実行しようとするとエラーが出てしまいます。 エラーの原因は何なのでしょうか? (なお、コマンドボタンのコードは「UserForm1.Show」のみです。 コード自体は本などを読みながら似たようなVBAを使った物を参考にしています。

  • VBAでフォームからシートへ入力

    シートが「回答フォーム」と「用語」と言うのがあります。 (1)「回答フォーム」シートに"入力"ボンタをクリックすると「用語」のシートに入力される。 (2)回答フォーム」シートに"検索"ボンタをクリックすると「用語」のシートからフォームへ表示される。 用語のシートに項目は、A列から、ナンバー、検索、フリガナ、用途、用語、意味とあります。 TextBox1に用語、TextBox2に用途、TextBox3に意味 とあります。 (1)には Private Sub 入力_Click()   Sheets("用語").ActiveSheet・・・ここがエラーになります。 「オブジェクトはこのプロパティまたはメソッドをサポートしていません。」 行 = ActiveCell.Row 列 = ActiveCell.Column Cells(行, 列) = UserForm1.TextBox1.Value Cells(行, 列 + 1) =UserForm1.TextBox2.Value   Cells(行, 列 + 2)=UerForm1.TextBox3.Value UserForm1.TextBox1.SetFocus Cells(行 + 1, 列).Select End Sub (2)には Private Sub CommandButton1_Click() Set sh1 = bk.Worksheets("回答フォーム") Set sh5 = bk.Worksheets("用語") cnt1 = 2 UserForm1.TextBox1.Value・・・・ここのVALUEがエラーになります。 「コンパイルエラー プロパティの使い方が不正です。」 ActiveCell.FormulaR1C1 = "=MATCH(RC[-1],用語!C[-5],0)" n = ActiveCell.Value '用語 sh5.Cells(n, 2).Value = sh1.TextBox1.Value '意味 sh5.Cells(n, 3).Value = sh1.TextBox3.Value '用途 sh5.Cells(n, 4).Value = sh1.TextBox2.Value End Sub 申し訳ないですがよろしくお願い致します。

  • VBAにてリストボックスに表示された文字をエクセルのセルにコピペするには

    先日、ここで教えてもらった以下の内容で、幾つかのテキストボックスに表示された内容のうち、電話番号をエクセルのセルに転記する方法が、上手くいきません。”検索"名のシート上で実行します。 過去のログを参考にしましたが、解決できませんでした。 またお世話になりますが、だれか教えてください。 Private Sub CommandButton1_Click() Dim Namae As String Dim MeNamae As UserForm Dim ken As String Namae = TextBox1.Text Set MeNamae = UserForm1 Call 検索(Namae, MeNamae) End Sub Public Sub 検索(ByVal Namae As String, ByRef MeNamae As UserForm) Dim Nagasa As Integer Dim i As Long Dim MaxRows As Long Dim kensaku As Worksheet Dim KensakuChar As String Dim ListNamae As String Dim ListChar As String Dim KBanme As Integer Dim LBanme As Integer Set kensaku = Worksheets("顧客データ") MaxRows = kensaku.UsedRange.Rows.Count Nagasa = Len(Namae) MeNamae.ListBox1.Clear For i = 3 To MaxRows ListNamae = kensaku.Cells(i, 3) KBanme = 0 LBanme = 0 Do Do While Nagasa >= KBanme KBanme = KBanme + 1 KensakuChar = Mid(Namae, KBanme, 1) If KensakuChar <> " " Then Exit Do End If Loop Do While Nagasa >= LBanme LBanme = LBanme + 1 ListChar = Mid(ListNamae, LBanme, 1) If ListChar <> " " Then Exit Do End If Loop If KensakuChar = ListChar Then If Nagasa = KBanme Then With MeNamae .ListBox1.AddItem (ListNamae) .ListBox1.List(.ListBox1.ListCount - 1, 1) = i End With End If Else Exit Do End If Loop Until Nagasa <= KBanme Next End Sub Private Sub ListBox1_Click() Dim r As Long With ListBox1 If .ListIndex > -1 Then r = .List(.ListIndex, 1) '選択した名前の行 TextBox6.Value = Worksheets("顧客データ").Cells(r, 3) 'カタカナ名 TextBox2.Value = Worksheets("顧客データ").Cells(r, 5) '漢字名 TextBox3.Value = Worksheets("顧客データ").Cells(r, 7) '住所 TextBox4.Value = Worksheets("顧客データ").Cells(r, 1) '電話番号 TextBox5.Value = Worksheets("顧客データ").Cells(r, 2) '顧客番号 End If End With End Sub Private Sub CommandButton3_Click() 'クリックすると  Worksheets("検索").Cells(, 2) ’このシートの(G2)に上記の電話番号が入力される End Sub

  • VBA 追加したMultiPageでのイベント

    ExcelVBAでどうしても分からないところがあったため、質問させていただきました。 <Usrform上Control> ・UserForm1 ・MultiPage-Page1 ・CommandButton1(押すとPageが追加されます。Page1,Page2,Page3...) ・Combobox1 ・TextBox1 <現在可能な動作> UserForm1上にMultiPageのPage1を設定しています。 CommandButton1を押すとPage2が追加され、Page1上に設定されてあるCombobox1とTextBox1をPage2上に追加します。 <行ないたい動作> 現在は、Page1上でCombobox1の値が変更された時に、Page1上のTextBox1の値が変更されるように設定していますが、 Page2上のCombobox1の値が変更された時に、Page2上のTextBox1の値を変更することは出来ますでしょうか? 使用Versionは、Excel 2003です。 何卒、よろしくお願いします。 <Code> Private Sub CommandButton3_Click() Dim myCmbbx As MSForms.ComboBox Dim myTxtbx As MSForms.TextBox With MultiPage1 .Pages.Add , , .Value + 1 .Value = .Value + 1 End With With MultiPage1.SelectedItem Set myCmbbx = .Controls.Add("Forms.Combobox.1", "ComboBox1", True) With myCmbbx .AddItem "AAA" .AddItem "BBB" .AddItem "CCC" End With Set myTxtbx = .Controls.Add("Forms.TextBox.1", "TextBox1", True) With myTxtbx .MultiLine = True End With End With End Sub Private Sub ComboBox1_change() If ComboBox1.Text = "BBB" Then TextBox1.Value=1234567 End If End Sub

  • VBA 標準モジュールとフォーム (続き)

    先ほど、同じ質問タイトルで質問させていただいたものです。この場合どうなりますか? モジュールでの変数file_nameをフォームのボタンをクリックしたら"text.xls"が表示されるようにしたいです。 (イメージとしては、エクセルのsheet1にコマンドボタンがあってクリックするとフォームが立ち上がってフォームのコマンドボタンをクリックすると"test.xls"が表示される) モジュール Private Sub CommandButton1_Click() ←エクセルsheet1にボタンがある   dim file_name as string file_name="test.xls"   UserForm1.Show End Sub フォーム(UserForm1) Sub CommandButton1_Click() ←フォームにボタンがある MsgBox file_name End Sub

  • (VBA)ユーザーフォームの値を、モジュールで使用

    ユーザーフォームを使用したく UserForm1に以下を配置 TextBox1 TextBox2 CommandButton1 CommandButon1に以下のコード書き込みました Private Sub CommandButton1_Click() Dim N As Single Dim M As Single N = UserForm1.TextBox1.Text M = UserForm1.TextBox2.Text Unload UserForm1 End Sub 標準モジュールに以下を記載して ユーザーフォームの値を、モジュールで使用したいのですが [「M=~」で型が一致しません(エラー13)がでます。 「M=~とN=~」 を削除すると MsgBoxの値がM,Nともにゼロになります Public M As Single Public N As Single UserForm1.Show 1 M = UserForm1.TextBox1.Text     ----> ここでエラー13 N = UserForm1.TextBox1.Text MsgBox M MsgBox N ------------------------------ どこでコードが間違っていますか ?

  • VBA controlsouce の使い方

    エクセル2002使用です。 個人情報リストのようなものを作ってます。 ユーザーフォームにTextBox1とCommandButton1をつくり、そこにセルに既に入力されているデーターを入力したいのですが、うまくいきません。 Private Sub CommandButton1_Click() UserForm1.TextBox1.ControlSource = _ Worksheets(1).Range("B5").Value End Sub どこか悪いのか全くわからず困ってます。 よろしくお願いします。

  • エクセルVBA テキストボックス

    いつもお世話になっております。 エクセルでVBAを使いユーザーフォームのテキストボックスで 文章入力をしようと思っているのですが、少しトラブルがありましたのでお教え願います。 エクセルシートの横がa~k、縦を9~34までのシートを結合して その中にテキストボックスで入力した文章を入れるように作っています。 MultiLineとEnterKeyBehaviorをTrueにして Private Sub CommandButton1_Click() Unload Me End Sub Private Sub TextBox1_Change() Sheets("sheet1").Range("a9") = UserForm1.TextBox1 End Sub Private Sub UserForm_Initialize() TextBox1.Value = Range("a9").Value End Sub Private Sub UserForm_Activate() With Me .Left = Application.Left .Top = Application.Top .Left = .Left + 350 .Top = .Top + 80 End With End Sub という状態になっているのですが、文章を入力して16行目で改行するとシートの方で「#VALUE!」と出てきてしまうので一旦ユーザーフォームを閉じてもう一度フォームを立ち上げると 「実行時エラー’-2147352571(80020005) Valueプロパティが設定できません。種類が一致しません。」 と出てきます。 デバッグすると  Private Sub CommandButton1_Click() → UserForm1.Show  End Sub と出てきます。 なにがおかしいのでしょうか? 今回初めてVBAを作っているので初歩的な間違いかもしれませんがよろしくお願いします

  • VBAにてリストボックスで選択すると別ブックにあるデータを個別の窓へ表示させるには?

    はじめまして、ゴールデンウィーク中にVBAを勉強していますが、上手くいきません。内容は、「UserForm1を使って別シートにあるデーターから検索を行い、ListBox1に抽出されたリストを選択すると個別のTextBox2に関連する詳細を表示させる」というものです。別シートには「顧客データ」があり、A列より「担当、氏名、カタナカ、住所、電話番号・・・」とデーターが並んでいます。中途半端な状態ですが、これ以上進めません。だれか助けてください。 Private Sub CommandButton1_Click() Dim Namae As String Dim MeNamae As Object Dim ken As String Namae = TextBox1.Text Set MeNamae = UserForm1 Call 検索(Namae, MeNamae) End Sub '受付画面に検索画面窓を出し、顧客データから検索した結果を出すマクロ Public Sub 検索(ByVal Namae As String, ByRef MeNamae As Object) Dim Nagasa As Integer Dim i As Long Dim MaxRows As Long Dim kensaku As Object Dim KensakuChar As String Dim ListNamae As String Dim ListChar As String Dim KBanme As Integer Dim LBanme As Integer Set kensaku = Worksheets("顧客データ") MaxRows = kensaku.UsedRange.Rows.Count Nagasa = Len(Namae) MeNamae.ListBox1.Clear For i = 3 To MaxRows ListNamae = kensaku.Cells(i, 3) KBanme = 0 LBanme = 0 Do Do While Nagasa >= KBanme KBanme = KBanme + 1 KensakuChar = Mid(Namae, KBanme, 1) If KensakuChar <> " " Then Exit Do End If Loop Do While Nagasa >= LBanme LBanme = LBanme + 1 ListChar = Mid(ListNamae, LBanme, 1) If ListChar <> " " Then Exit Do End If Loop If KensakuChar = ListChar Then If Nagasa = KBanme Then With MeNamae .ListBox1.AddItem (ListNamae) End With End If Else Exit Do End If Loop Until Nagasa <= KBanme Next End Sub Private Sub ListBox1_Click() With ListBox1 If .ListIndex > -1 Then TextBox2.Value = .List(.ListIndex, 0)’←これでは何の意味も無い ' TextBox2.Value = kensaku.Cells(kensakuIndex, 3) ' TextBox2.Value = kensaku.Cells(kensaku, 3) ' TextBox2.Text = kokyaku.Hoken4 '      TextBox2.Text = kokyaku.Cells(i, 5) End If End With End Sub

  • Excel VBA ユーザフォームの検索について

    添付の画像のようなユーザフォームを作っています。 TextBox1に検索ワードを入力して、CommandButton1をクリックすると、下のComboBox1に一覧が出るようにしたいと思い、ほかのサイトから下記のコードを見つけて、作ってみました。参照先のsheet2を表示しているときは大丈夫なのですが、別のシートを選んでいるとエラーになります。 sheetは3つあり、それぞれ違うリストが入力されています。今回はsheet2のリストを参照したいのですが、最初はsheet1が表示されている状態で実行したいです。 エラーの内容は 実行時エラー9 インデックスが有効範囲にありません。 コチラがコードです。 Private Sub UserForm_Initialize() Dim i As Long, imax As Long Dim tbl() As Variant imax = ThisWorkbook.Worksheets("sheet2").Cells(Rows.Count, "A").End(xlUp).Row ReDim tbl(imax) For i = 1 To imax tbl(i) = Range("A" & i).Value Next i With ComboBox1 .List() = tbl() End With End Sub Private Sub CommandButton1_Click() Dim i As Long, imax As Long Dim tbl() As Variant Dim cnt As Long, j As Long j = -1 With ThisWorkbook.Worksheets("sheet2") imax = .Cells(Rows.Count, "A").End(xlUp).Row cnt = Application.CountIf(Range("A1:A" & imax), "*" & TextBox1.Text & "*") ReDim tbl(cnt) For i = 1 To imax If InStr(.Range("A" & i), TextBox1.Text) > 0 Then j = j + 1 tbl(j) = Range("A" & i).Value ←この部分がエラーになる End If Next i End With With ComboBox1 .List() = tbl() End With End Sub どこを直せば良いか、教えてください。 よろしくお願いします。

専門家に質問してみよう