• ベストアンサー

エクセルVBAでloop???

エクセルのVBAについて質問させてください。 フォームにtxt1.text~txt14.textがあります。 cmdDSをclickしたときに空値をセット(= "")したく、今は下のようになっています。 private sub cmdDS_click() txt1.text = "" txt2.text = "" … end sub ですが、1~14という数字以外はすべて同じ文であることから数字の部分だけを入れ替えるようにし、loopのようなものを使ってもっと簡単にできないでしょうか? マクロを組めば必然的にファイルのサイズが大きくなってしまうと言うことはわかっていますが、サイズを抑えるためにできることやそう言ったことについてのHPなどがありましたら併せて教えていただきたいと思います。 よろしくお願いします。

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

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

こんにちは。 >フォームにtxt1.text~txt14.textがあります。 txt1とかいうのは何ですか? TextBox のことですか? フォームとは何ですか? UserForm ですか? Form ツールのフォームには、TextBox とは呼びません。 Excelの場合は、できる限り標準名称を使用してください。オブジェクトの名前自体をVBのコントロールの名称にわざわざ書き換えているようですが、書き換えの手間とか面倒になると思います。なお、VBなら、コントロール配列を使えばよいと思います。また、Excelのこの種のコントロールで擬似的なコントロール配列は、あまり賛成できません。 一応、UserForm のTextBox とさせていただきます。 UserForm 場合 For i = 1 To 14   Me.Controls("Txt" & i).Text = "" Next >マクロを組めば必然的にファイルのサイズが大きくなってしまう 基本的に誤解があるように思います。 私は、Excelの使用メモリを減らすために、マクロを組みます。特に、Mode 関数や Frequency 関数のような配列を使うと、大きなファイルでは、とても、そのままでは使えませんので、その代わりに、マクロに切り替えます。また、アドインにすることにり、マクロ部とデータ部と切り離すなど、いくつかのテクニックがあります。 少し、話を膨らませて、個人的なことも書かせてもらいます。 Excelというものは、基本的にはファイルサイズの限界というものは、明確には仕様には出ていません。しかし、Excelを使用するキャッシュ・メモリがあるわけで、それは、私たちが想像するよりもはるかに小さいのです。マクロは、ファイルを開き、セキュリティ・パスが通れば、中間言語にコンパイルされます。その中間言語のファイルのストックの大きさには、当然限界はあるのですが、ファイルサイズとの直接の関係があるとはいえません。間接的には、他のメモリに押しやられることはあるかと思います。 サイズを抑えるというよりも、まずワークシート全体のメモリ管理をしなくてはならないのです。 マクロについては、「マクロの最適化」という名称で、マイクロソフトのサポートのライブラリに残されていますし、私もその内容については、ここの掲示板に書いたことがありますが、多くの方がは、それを重要視しません。しかし、ある程度のVBAに精通している方であれば、この基本的なルールをご存知ないとすれば、とても残念なことだと思います。そのルールに当てはめれば、正しいか正しくないか一目瞭然のはずなのです。 VBAコードを最適化する http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/modcore/html/deconoptimizingvbacode.asp 詳しい内容は、『Microsoft Office プログラマーズガイド』の中にあります。(私の所有しているものは、Office 97とOffice 2000) Office Tanaka でも、少し書いてありますが、こちらは、内容的に、それがそのまま応用できるわけでもなければ、その実験がそのまま実務で使えるわけでもありません。この方の原則を踏襲している人もあるようですが、おかしなコードになりやすいように思います。たとえば、シートをIndex で呼び出すというのは、現実的ではありません。 Office Tanaka http://www.officetanaka.net/excel/vba/speed/index.htm なお、補足として、ワークシートのメモリを減らす方法として、以下があります。 [XL] メモリを節約するワークシートの作成方法 http://support.microsoft.com/kb/401704/ja

chibii
質問者

お礼

不備ばかりの質問で申し訳ありませんでしたが、回答ありがとうございました。 サイズについては理解するのにまだ時間がかかりそうですが、 マクロはお陰様で組むことができました。 本当にありがとうございました。

その他の回答 (3)

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

こんばんは。 #2の回答者です。割り込みさせていただきます。 ただし、UserFormを条件とします。 >If Left$(ctrl.name, 3) = "txt" Then ctrl.Text = "" >If Left$(ctrl.name, 2) = "op" Then ctrl.Value = False そういう形にするなら、普通は、オブジェクト型を取って処理すれば良いのでは? ただし、Optionボタンを、あえてすべてFalse にするという考え方自体はヘンですが。   Dim ctrl As Control   For Each ctrl In Me.Controls     If TypeOf ctrl Is MSForms.TextBox Then       ctrl.Text = ""     ElseIf TypeOf ctrl Is MSForms.OptionButton Then       ctrl.Value = False     End If   Next

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

3つの場合((テキストボックスも、フォームも、フォームへD&Dしてから名前を変えてない場合。) 全部初期化かクリアする方法 Private Sub CommandButton1_Click() For i = 1 To 3 ’UserForm1.Controls("TextBox" & i).Text = "aa" '初期化 UserForm1.Controls("TextBox" & i).Text = "" 'クリア Next i End Sub ーー #1のオプションボタンの場合 Frameを普通使うと思うが、使わない場合の例 Private Sub CommandButton1_Click() UserForm1.OptionButton2.Value = True MsgBox "A" For i = 1 To 3 UserForm1.Controls("OptionButton" & i).Value = False 'False Next i End Sub 上2行はテスト確認の為に入れている。 グループ化したオプションボタンのOnのもの1つをOffにすればよいが 無駄をして、3つともOFFにしている。 ーー http://www.hisystec.co.jp/VBAroom/VBA08.html を参照 Frameを普通使うと思うが(下記はFrameが2つ、オプションボタン各3つの例) AAが表示された瞬間でOnになっていることを確認し、OKをクリックで消える(Offになる)ことを確認してください Private Sub CommandButton1_Click() UserForm1.Frame2.OptionButton5.Value = True MsgBox "AA" For i = 4 To 6 UserForm1.Frame2.Controls("OptionButton" & i) = False Next i End Sub

  • project-a
  • ベストアンサー率54% (107/195)
回答No.1

以下は一例です。 フォーム上のコントロールを検索して、名前の左3文字が "txt"なら内容をクリアします。 ※"UserForm1"はフォーム名なので、お使いのフォーム名に直してください。 Private Sub CommandButton1_Click()  Dim ctrl As Control  For Each ctrl In UserForm1.Controls   If Left$(ctrl.Name, 3) = "txt" Then    ctrl.Text = ""   End If  Next End Sub

chibii
質問者

お礼

ありがとうございました。 お礼に書こうか補則に書こうか悩んだのですが、 同じ方法でオプションボタンをfalseにできないでしょうか? (同じコマンドボタンをクリックしたときの動作としてです。) Dim ctrl As Control For Each ctrl In (4)Form予定入力.Controls If Left$(ctrl.name, 3) = "txt" Then ctrl.Text = "" If Left$(ctrl.name, 2) = "op" Then ctrl.Value = False End If Next こうかな?と思ったのですが、 テキストを空値にすることしかできませんでした。

関連するQ&A

  • VBA Do…Loopについて

    お世話になっております。 ただいま、アクセスVBAにてDo…Loopの練習をしております。 テキストボックス1に数字を入れ、コマンドボタンを押すと入力した数字が1ずつ引かれる形でテキストボックス2に入るようにしたいです。 (テキストボックス1に「8」→テキストボックス2に「87654321」のように) Dim I As Variant I = Me.text1.Value Me.text2.Value = Me.text1.Value Do Until I = 1 I = I - 1 Me.text2.Value = Me.txt2.Value & I Loop で動作そのものはするのですが、doloop前の「Me.text2.Value = Me.text1.Value」を正さないといけないようです。(課題です) これがないと入力された数字そのものが入らなくなってしまうのですが… よろしくおねがいします。

  • エクセルのVBAのことで

    コマンドボタンで「Macro1」というマクロを実行させるVBAは以下だと思いますが。 Private Sub CommandButton1_Click() Call Macro1 End Sub 上記に、Sheet1・Sheet2・Sheet3に対して実行するということを加えると、どんなふうになるでしょうか。

  • エクセル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を作っているので初歩的な間違いかもしれませんがよろしくお願いします

  • EXCEL VBA UserForm のご質問

    よろしくお願いします ユーザーフォームに決定ボタンで、テキストボックスを任意の数追加しました。 追加されたテキストボックスにD1.D2.D3.D4・・・と名前をつけ、それぞれに 1.2.3と数値を記入し、 登録ボタンをクリックした後ワークシートkeyplanの 指定したセルD30~G30へ代入させようとしたところ、 「変数が定義されていません」となってしまいます。 Nameの付け方が悪いのでしょうか。転機の仕方が悪いのでしょうか。 マクロを勉強し始めて日が浅いので、対処の方法がわかりません。 ご回答よろしくお願いします。 Option Explicit Private Sub UserForm_Initialize() worksheets("keyplan").Select End Sub Private Sub 決定_Click() Dim txt As Variant Dim i As Integer 'テキストボックスを配置 i = nyuryokubox() For i = 1 To i Set txt = Me.Controls.Add("Forms.Textbox.1", , True) With txt .Width = 20 .Height = 18 .Top = 300 .Left = 1 + (.Width + 80) * (i + 1) .BorderColor = &H666666 .BorderStyle = fmBorderStyleSingle .Font.Size = 15 .Name = "D" & i End With Next End Sub Private Sub 登録_Click() With worksheets("keyplan").Select .Range("D30").Value = D1.text .Range("E30").Value = D2.text .Range("F30").Value = D3.text .Range("G30").Value = D4.text End With End Sub 変数 i にはテキストボックス(nyuryokubox)に直接数値を入れるようにしています

  • EXCEL VBAのユーザーフォームに引数を渡す方法について

    すいません、EXCEL VBAのユーザーフォームに引数を渡す方法についてご質問があります。 シート上にコマンドボタンを2つ用意する。 コマンドボタン1を押すと変数mは1 コマンドボタン2を押すと変数mは2 としてユーザーフォームを呼び出す。 Public m As Integer Private Sub CommandButton1_Click()  m = 1  Call フォーム呼び出し(m) End Sub Private Sub CommandButton2_Click()  m = 2  Call フォーム呼び出し(m) End Sub Sub フォーム呼び出し(m As Integer)  UserForm1.Show End Sub 次にユーザフォームにコマンドボタンを1個置き、 ボタンを押したとき、mが1であれば「ボタン1」 mが2であれば「ボタン2」 とメッセージボックスを出し、ユーザーフォームを閉じる。 Private Sub CommandButton1_Click()   If m = 1 Then    MsgBox "ボタン2"   ElseIf m = 2 Then    MsgBox "ボタン2"   End If  Unload UserForm1 End Sub プロシージャ間の引数渡しは色々なテキストに載っているのですが ユーザーフォームに引数を渡す方法はどうも見つからず、 Private Sub CommandButton1_Click(m) としても、コンパイルエラーとなってしまいます。 よろしくご教示をお願いいたします。

  • エクセル VBAのチェックボックスについて

    お読みくださり、ありがとうございます。 エクセル初心者でございます。 エクセルのマクロなのですが、 お詳しい方、是非教えて欲しいです!汗 調子に乗って入力フォームなるものを作りました。 入力フォームの中にて、チェックボックスで「ある」「なし」の項目を入れてみたのですが、チェックしていないのに、値が入る現象が起きています汗 以下、素人が書いたコードを恥を承知で記載させていただきます。 Private Sub CheckBox1_Click() If CheckBox1.Value = True Then OK = "○" End If End Sub Private Sub CheckBox2_Click() If CheckBox2.Value = True Then NO = "×" End If End Sub Private Sub UserForm_Click() End Sub '以下のコードは、登録ボタンがクリックされたときの処理! Private Sub 登録ボタン_Click() If TextBox1.Text = "" Then MsgBox "グッズ名を入力してください。" Exit Sub End If If TextBox2.Text = "" Then MsgBox "アプローチ先を入力してください。" Exit Sub End If With Worksheets("協賛グッズ") With Cells(Rows.Count, 2).End(xlUp) .Offset(1, 0).Value = TextBox1.Text .Offset(1, 1).Value = mori .Offset(1, 2).Value = mori2 .Offset(1, 3).Value = TextBox2.Text .Offset(1, 5).Value = TextBox3.Text .Offset(1, 6).Value = TextBox4.Text .Offset(1, 7).Value = TextBox5.Text .Offset(1, 8).Value = TextBox6.Text End With End With TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" TextBox5.Text = "" TextBox6.Text = "" CheckBox1.Value = False CheckBox2.Value = False End Sub 以上です。 おかしなところ満載かと思いますが、 チェックを入れた項目だけ値を入れたいと考えております。 おわかりになるかたおりましたら何卒お助けください汗 よろしくお願いいたします。

  • エクセルVBA、ユーザーフォーム[×]活用法?

    いま、VBAでマクロを作成中なのですが、 ユーザーフォームの右上に存在する×ボタンの使い方がよくわかりません。 マクロのイメージは以下のとおりです。 ユーザーフォーム・オブジェクト ┌─────────────┐ │              【×】  │←この×ボタンです │                   │ │  ┌───────┐    │ │  │ Button1     │    │ Private sub Button1_Click()   ・      ・ If Button_×_click Exit sub Else ・        ・ End If End Sub ×ボタンをコマンドボタンのように動作させるイベントマクロを作成するにはどのように コーディングしたらよいのかさっぱりわからずこまっています。 どうかご回答のほどよろしくおねがいもうしあげますm( _ _ )m

  • エクセルVBAユーザーフォームのテキストボックスについて

    VBA初心者です。 エクセルVBAユーザーフォームのテキストボックスに入力した数字を通貨単位でセルに反映させるにはどうすれば良いのですか? Private Sub 一月OK_Click() Range("J10") = Me.一月売上 Range("J13") = Me.一月粗利 Unload Me End Sub 今はこんな感じです。 ここで月度の売上を入力してシート上で合計させたいのです。 よろしくお願いします。

  • 同じマクロ名でも、違うモジュールならエラーにならな

    同じマクロ名でも、違うモジュールならエラーにならない? エクセルVBAについてご教授ください。 標準モジュールに ――――――――― Option Explicit Sub CommandButton1_Click() MsgBox "" End Sub Sub CommandButton1_Click() MsgBox "" End Sub ――――――――― と同じマクロ名を2つ作ったら、コンパイルエラーになりますが、 上記のコードは一度消して、フォームモジュールに ――――――――― Private Sub CommandButton1_Click() MsgBox "" End Sub ――――――――― を一つ作り、 標準モジュールに ――――――――― Sub CommandButton1_Click() MsgBox "" End Sub ――――――――― を一つ作った場合は、エラーにならずにマクロを実行できました。 これは、フォームモジュールがPrivate Subだからでしょうか? フォームモジュールに1つ、 標準モジュールに1つ なら同じマクロ名を使っても、エラーにならないという事でしょうか? よろしくお願いします。

  • Excel VBAで、ユーザーフォームの値を、モジュールで使用したい。

    VBA初心者です。(おそらく)基本的な質問で、申し訳ありません。 ユーザーフォーム1には、テキストボックス1とコマンドボタン1が配置されているとします。 Sub TEST () Dim N Userform1.Show MsgBox N End Sub Private Sub CommandButton1_Click() Dim N N = TextBox1.Text UserForm1.Hide End Sub Sub TESTを実行した時に、ユーザーフォーム1からNの値を引き継ぐには、どうしたら良いのでしょうか?よろしくお願いします。

専門家に質問してみよう