処理速度を速くする方法

このQ&Aのポイント
  • 質問文章から処理速度を速くする方法について教えてください。
  • 質問文章のVBAコードについて、処理速度を向上させる方法を教えてください。
  • 処理速度を高速化するためのベストプラクティスはありますか?
回答を見る
  • ベストアンサー

処理速度を速くする方法教えてください。

Private Sub CommandButton1_Click() Dim irow As Long Dim Celldata(1 To 6) As Double Dim ekimen(1 To 6) As String '高さ読込み If TextBox8.Value = "" Then MsgBox ("No.を入力") End End If If TextBox9.Value = "" Then MsgBox ("温度を入力") End End If If TextBox10.Value = "" Then MsgBox ("係数を入力") End End If Celldata(1) = TextBox1.Value + (TextBox7.Value - TextBox9.Value) * TextBox10.Value Celldata(2) = TextBox2.Value + (TextBox7.Value - TextBox9.Value) * TextBox10.Value Celldata(3) = TextBox3.Value + (TextBox7.Value - TextBox9.Value) * TextBox10.Value Celldata(4) = TextBox4.Value + (TextBox7.Value - TextBox9.Value) * TextBox10.Value Celldata(5) = TextBox5.Value + (TextBox7.Value - TextBox9.Value) * TextBox10.Value Celldata(6) = TextBox6.Value + (TextBox7.Value - TextBox9.Value) * TextBox10.Value '入力と修正 Dim i As Long '最終行から試験Noが一致するものを探す For i = 65535 To 6 Step -1 If CStr(Cells(i, 1)) = Trim(TextBox8.Value) Then Set myrange = Sheets("データ").Cells(i - 1, 1) '記入セルがoffset(1,x)になっているため、i-1にしています。 Exit For End If Next i 'Noが一致しない場合、最終行を記入セルに設定する。 If i = 5 Then Set myrange = Sheets("データ").Range("A65536").End(xlUp) End If 'ワークシートへの転記 With myrange .Offset(1, 0).Value = TextBox8.Value '----No. .Offset(1, 1).Value = Celldata(1) '----1計測 .Offset(1, 2).Value = Celldata(2) '----2計測 .Offset(1, 3).Value = Celldata(3) '----3ル計測 .Offset(1, 4).Value = Celldata(4) '----4計測 .Offset(1, 5).Value = Celldata(5) '----5計測 .Offset(1, 6).Value = Celldata(6) '----6計測 .Offset(1, 13).Value = TextBox1.Value '----1追加 .Offset(1, 14).Value = TextBox2.Value '----2追加 .Offset(1, 15).Value = TextBox3.Value '----3追加 .Offset(1, 16).Value = TextBox4.Value '----4追加 .Offset(1, 17).Value = TextBox5.Value '----5追加 .Offset(1, 18).Value = TextBox6.Value '----6追加 .Offset(1, 19).Value = TextBox7.Value '---温度 .Offset(1, 20).Value = TextBox11.Value '----1高さ .Offset(1, 21).Value = TextBox12.Value '----2高さ .Offset(1, 22).Value = TextBox13.Value '----3高さ .Offset(1, 23).Value = TextBox14.Value '----4高さ .Offset(1, 24).Value = TextBox15.Value '----5高さ .Offset(1, 25).Value = TextBox16.Value '----6高さ '入力ボックスのクリア TextBox1.Value = "" '----1セル TextBox2.Value = "" '----2セル TextBox3.Value = "" '----3セル TextBox4.Value = "" '----4セル TextBox5.Value = "" '----5セル TextBox6.Value = "" '----6セル TextBox7.Value = "" '---温度 TextBox11.Value = "" '----1セル TextBox12.Value = "" '----2セル TextBox13.Value = "" '----3セル TextBox14.Value = "" '----4セル TextBox15.Value = "" '----5セル TextBox16.Value = "" '----6セル End With 'lblComment.Caption = "ワークシートに転記しました!" End Sub Private Sub CommandButton2_Click() Dim i As Long '入力チェック If TextBox8.Value = "" Then MsgBox ("No.を入力") End End If If TextBox9.Value = "" Then MsgBox ("温度を入力") End End If If TextBox10.Value = "" Then MsgBox ("係数を入力") End End If For i = 65535 To 6 Step -1 If CStr(Cells(i, 1)) = Trim(TextBox8.Value) Then Set myrange = Sheets("データ").Cells(i - 1, 1) '記入セルがoffset(1,x)になっているため、i-1にしています。 Exit For End If Next i '受付No.がない場合、終了します。 If i = 5 Then MsgBox ("No.が見つかりません") End End If '入力の処理と逆の処理を行います。 With myrange TextBox1.Value = .Offset(1, 13).Value '---1計測 TextBox2.Value = .Offset(1, 14).Value '---2計測 TextBox3.Value = .Offset(1, 15).Value '---3計測 TextBox4.Value = .Offset(1, 16).Value '---4計測 TextBox5.Value = .Offset(1, 17).Value '---5計測 TextBox6.Value = .Offset(1, 18).Value '---6計測 TextBox7.Value = .Offset(1, 19).Value '---温度 TextBox11.Value = .Offset(1, 20).Value '---1高さ TextBox12.Value = .Offset(1, 21).Value '---2高さ TextBox13.Value = .Offset(1, 22).Value '---3高さ TextBox14.Value = .Offset(1, 23).Value '---4高さ TextBox15.Value = .Offset(1, 24).Value '---5高さ TextBox16.Value = .Offset(1, 25).Value '---6高さ End With End Sub

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

CommandButton1_Click()を例に、何をどう書き換えたのか対応を書きました。 モジュールに貼付けた方が多少読み易いと思います。 コメントブロック外せば、#1と全く同じ内容です。 Private Sub Re8107868() 'Dim ekimen(1 To 6) As String '高さ読込み ' 未使用? 'Dim Celldata(1 To 6) As Double ' ' ▼   Dim Celldata(0 To 6) As Double '----No. 1-6計測   Dim CellDataB(1 To 13) As Double '----1-6追加 温度 1-6高さ ' ★追加 ' ' ▲   Dim dblT As Double ' ★追加   Dim nTarget As Long ' ★追加 'Dim myrange As Range 'Dim irow As Long ' 未使用?   Dim i As Long   If TextBox8.Value = "" Then     MsgBox ("No.を入力") 'End ' ' ▼     Me.Hide ' ★     Exit Sub ' ★ ' ' ▲ 'End If 'If TextBox9.Value = "" Then ' ' ▼   ElseIf TextBox9.Value = "" Then ' ' ▲     MsgBox ("温度を入力") 'End ' ' ▼     Me.Hide ' ★     Exit Sub ' ★ ' ' ▲ 'End If 'If TextBox10.Value = "" Then ' ' ▼   ElseIf TextBox10.Value = "" Then ' ' ▲     MsgBox ("係数を入力") 'End ' ' ▼     Me.Hide ' ★     Exit Sub ' ★ ' ' ▲   End If '.Offset(1, 0).Value = TextBox8.Value '----No. ' ' ▼   Celldata(0) = CLng(TextBox8.Value) '----No. ' ' ▲   With Me.Controls ' ★追加 'Celldata(1) = TextBox1.Value + (TextBox7.Value - TextBox9.Value) * TextBox10.Value 'Celldata(2) = TextBox2.Value + (TextBox7.Value - TextBox9.Value) * TextBox10.Value 'Celldata(3) = TextBox3.Value + (TextBox7.Value - TextBox9.Value) * TextBox10.Value 'Celldata(4) = TextBox4.Value + (TextBox7.Value - TextBox9.Value) * TextBox10.Value 'Celldata(5) = TextBox5.Value + (TextBox7.Value - TextBox9.Value) * TextBox10.Value 'Celldata(6) = TextBox6.Value + (TextBox7.Value - TextBox9.Value) * TextBox10.Value ' ' ▼     dblT = (CDbl(TextBox7.Value) - CDbl(TextBox9.Value)) * CDbl(TextBox10.Value)     For i = 1 To 6       Celldata(i) = dblT + CDbl(.Item("TextBox" & i).Value) '----1-6計測     Next i ' ' ▲ '.Offset(1, 13).Value = TextBox1.Value '----1追加 '.Offset(1, 14).Value = TextBox2.Value '----2追加 '.Offset(1, 15).Value = TextBox3.Value '----3追加 '.Offset(1, 16).Value = TextBox4.Value '----4追加 '.Offset(1, 17).Value = TextBox5.Value '----5追加 '.Offset(1, 18).Value = TextBox6.Value '----6追加 '.Offset(1, 19).Value = TextBox7.Value '---温度 ' ' ▼     For i = 1 To 7       CellDataB(i) = CDbl(.Item("TextBox" & i).Value) '----1-6追加 温度     Next i ' ' ▲ '.Offset(1, 20).Value = TextBox11.Value '----1高さ '.Offset(1, 21).Value = TextBox12.Value '----2高さ '.Offset(1, 22).Value = TextBox13.Value '----3高さ '.Offset(1, 23).Value = TextBox14.Value '----4高さ '.Offset(1, 24).Value = TextBox15.Value '----5高さ '.Offset(1, 25).Value = TextBox16.Value '----6高さ ' ' ▼     For i = 11 To 16       CellDataB(i - 3) = CDbl(.Item("TextBox" & i).Value) '----1-6高さ     Next i ' ' ▲ ''入力ボックスのクリア 'TextBox1.Value = "" '----1セル 'TextBox2.Value = "" '----2セル 'TextBox3.Value = "" '----3セル 'TextBox4.Value = "" '----4セル 'TextBox5.Value = "" '----5セル 'TextBox6.Value = "" '----6セル 'TextBox7.Value = "" '---温度 'TextBox11.Value = "" '----1セル 'TextBox12.Value = "" '----2セル 'TextBox13.Value = "" '----3セル 'TextBox14.Value = "" '----4セル 'TextBox15.Value = "" '----5セル 'TextBox16.Value = "" '----6セル ' ' ▼     For i = 1 To 7       .Item("TextBox" & i).Value = ""     Next i     For i = 11 To 16       .Item("TextBox" & i).Value = ""     Next i ' ' ▲   End With ' With Me.Controls ' ★追加 '入力と修正   With Sheets("データ") ' ★追加 '最終行から試験Noが一致するものを探す 'For i = 65535 To 6 Step -1 'If CStr(Cells(i, 1)) = Trim(TextBox8.Value) Then 'Set myrange = Sheets("データ").Cells(i - 1, 1) ''記入セルがoffset(1,x)になっているため、i-1にしています。 'Exit For 'End If 'Next i ' ' ▼     nTarget = CLng(TextBox8.Value)     For i = .Cells(Rows.Count, 1).End(xlUp).Row To 6 Step -1       If .Cells(i, 1) = nTarget Then Exit For     Next i ' ' ▲ 'Noが一致しない場合、最終行を記入セルに設定する。 'If i = 5 Then 'Set myrange = Sheets("データ").Range("A65536").End(xlUp) 'End If ' ' ▼     If i = 5 Then i = .Cells(Rows.Count, 1).End(xlUp).Row + 1 ' ' ▲ 変数 i が、そのまま、出力先の行位置を指す。 'ワークシートへの転記 'With myrange ' ... 'End With ' ' ▼ 'ワークシートへの転記(配列変数を出力)     .Cells(i, 1).Resize(, 6).Value = Celldata() '----No. 1-6計測     .Cells(i, 13).Resize(, 13).Value = CellDataB() '----1-6追加 温度 1-6高さ ' ' ▲   End With ' With Sheets("データ") ' ★追加 End Sub

udonnteisyoku
質問者

お礼

質問でsheet名を間違えておりましたので、混乱をさせてしまい申し訳ありませんでした。

その他の回答 (2)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.3

試しにサンプル作って走らせました。 結果、コーディングのミスに気が付きましたので訂正です。 誤)     .Cells(i, 1).Resize(, 6).Value = Celldata() 正)     .Cells(i, 1).Resize(, 7).Value = Celldata() 以上、失礼しました。 それと、 >  扱うシートは、Sheets("データ") だけ。 というこちらの前提が違うような気もしています。 2つのシート間でデータのやり取りをしている?のだとすると そちらで修正して貰う必要があります。   .Cells(... と書いてあるのが、   Sheets("データ") のセルという意味で、すべて統一してあります。 これを   Cells(... と書き換えるとSheets("データ")ではなくて   ActivaSheet のセルという意味になります。 もし、こちらの誤解だったなら、 書き換えてみながら修正を加えてみてください。 取り急ぎ、以上です。

udonnteisyoku
質問者

お礼

返事が遅くなり申し訳ありません。仕事の都合でマクロを作成することになり、周囲の方に教えてもらいながら、作成しております。何度も作り変えておりますので不要なマクロが残っておりました。教えていただけるだけでも感謝しているところ、修正いただき有難うございました。

udonnteisyoku
質問者

補足

扱うシートは、Sheets("データ") だけで行っております。集計は別のマクロを利用しています。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

こんにちは。 イメージを読み取ることが出来ないので、ちょっと苦しいですが、 類推を交えて、書いてみました。 今回はサンプルを作成せずにコードだけ書いてテストも検証も無しで 進めるよりないので、一発で正解してなくても、ご勘弁を。 ///  扱うシートは、Sheets("データ") だけ。  扱うデータは、すべて、小数点数(Double)  ご提示のコードがすべてで、各プロシージャに他の既述がないこと。 など、未確認の前提で書いています。 ///  With ステートメント の扱い  For...Next ループでTextBoxを捉える方法  配列変数の受け渡し  If...Then...ElseIf...Then...End If の扱い  End は使わないこと  代わりに Exit Sub すること  ループの中の固定値は事前に変数に格納すること  シートの行数は Rows.Count で取得  最終行を End プロパティで取得すること  Range オブジェクトをセットする代わりに行位置だけ取得すること などが、変更点で、覚えて欲しいポイントでもあります。 /// CDbl()は、そう書かないと困る場合を想定していますが、 そう書くことでエラーになる場合もあるかも知れませんので CDbl()の行でエラーがでたら、CDbl()をはずしてください。 /// Dim CellDataB(1 To 13) As Double は、もしかして実際に合わないかも知れませんので Dim CellDataB(1 To 13) と書き換えてもらってもいいです。 /// 文字数制限の都合で連続で投稿します。 次の投稿では、CommandButton1_Click() を例に、 何をどう書き換えたのか、対応を示しておきます。 /// とりあえず、バックアップの上、試してみてください。 ' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 Private Sub CommandButton1_Click() ' Re8107868-1   Dim Celldata(0 To 6) As Double '----No. 1-6計測   Dim CellDataB(1 To 13) As Double '----1-6追加 温度 1-6高さ ' ★追加   Dim dblT As Double ' ★追加   Dim nTarget As Long ' ★追加   Dim i As Long ' ' 入力チェック   If TextBox8.Value = "" Then     MsgBox ("No.を入力")     Me.Hide ' ★     Exit Sub ' ★   ElseIf TextBox9.Value = "" Then     MsgBox ("温度を入力")     Me.Hide ' ★     Exit Sub ' ★   ElseIf TextBox10.Value = "" Then     MsgBox ("係数を入力")     Me.Hide ' ★     Exit Sub ' ★   End If ' '----No.   Celldata(0) = CLng(TextBox8.Value)   With Me.Controls ' ★追加 ' '----1-6計測     dblT = (CDbl(TextBox7.Value) - CDbl(TextBox9.Value)) * CDbl(TextBox10.Value)     For i = 1 To 6       Celldata(i) = dblT + CDbl(.Item("TextBox" & i).Value)     Next i ' '----1-6追加 温度     For i = 1 To 7       CellDataB(i) = CDbl(.Item("TextBox" & i).Value)     Next i ' '----1-6高さ     For i = 11 To 16       CellDataB(i - 3) = CDbl(.Item("TextBox" & i).Value)     Next i ' '入力ボックスのクリア     For i = 1 To 7       .Item("TextBox" & i).Value = ""     Next i     For i = 11 To 16       .Item("TextBox" & i).Value = ""     Next i   End With   With Sheets("データ") ' ★追加 ' ' 最終行から試験Noが一致するものを探す     nTarget = CLng(TextBox8.Value)     For i = .Cells(Rows.Count, 1).End(xlUp).Row To 6 Step -1       If .Cells(i, 1) = nTarget Then Exit For     Next i ' 'Noが一致しない場合、最終行を記入セルに設定する。     If i = 5 Then i = .Cells(Rows.Count, 1).End(xlUp).Row + 1 ' ' 変数 i が、そのまま、出力先の行位置を指す。 ' ' ワークシートへの転記(配列変数を出力)     .Cells(i, 1).Resize(, 6).Value = Celldata() '----No. 1-6計測     .Cells(i, 13).Resize(, 13).Value = CellDataB() '----1-6追加 温度 1-6高さ   End With ' ' lblComment.Caption = "ワークシートに転記しました!" End Sub ' ' ============================== Private Sub CommandButton2_Click() ' Re8107868-2   Dim mtxV()   Dim nTarget As Long   Dim i As Long ' ' 入力チェック   If TextBox8.Value = "" Then     MsgBox ("No.を入力")     Me.Hide     Exit Sub   ElseIf TextBox9.Value = "" Then     MsgBox ("温度を入力")     Me.Hide     Exit Sub   ElseIf TextBox10.Value = "" Then     MsgBox ("係数を入力")     Me.Hide     Exit Sub   End If   With Sheets("データ") ' ' 最終行から試験Noが一致するものを探す     nTarget = CLng(TextBox8.Value)     For i = .Cells(Rows.Count, 1).End(xlUp).Row To 6 Step -1       If .Cells(i, 1) = nTarget Then Exit For     Next i ' ' 受付No.がない場合、終了します。     If i = 5 Then       MsgBox ("No.が見つかりません")       Me.Hide       Exit Sub     End If ' ' 該する行位置 i 行の 13列めのセルから13列分 のデータを配列変数に格納     mtxV() = .Cells(i, 13).Resize(, 13).Value   End With ' ' 入力の処理と逆の処理を行います。   With Me.Controls ' '----1-6追加 温度     For i = 1 To 7       .Item("TextBox" & i).Value = mtxV(1, i)     Next i ' '----1-6高さ     For i = 8 To 13       .Item("TextBox" & i + 3).Value = mtxV(1, i)     Next i   End With   Erase mtxV() End Sub ' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

udonnteisyoku
質問者

お礼

返事が遅くなり申し訳ありません。本日試しましたところ、一部ずれがありましたが、修正し問題なく動作しました。有難うございました。

関連するQ&A

  • CheckBoxとTextBoxの値を貼付る方法

    よろしくお願いします。 Dim n As Long Dim r As Range Dim C, buf As String n = Cells(Rows.Count, "A").End(xlUp).Row + 1 Range("A" & n).Select For Each C In Controls If TypeName(C) = "CheckBox" Then If C.Value Then buf = buf & C.Caption & vbCrLf End If Next C ActiveCell.Offset(-1, 16).Value = buf & TextBox9.Value ’buf=チェックされている複数のCheckBoxのCaption ’この時のActiveCell.Offset(-1, 16).ValueにはbufとTextBox9の値も表示されています。 End If で、セルに入力して ActiveCell.Offset(0, 7).Value = ActiveCell.Offset(-1, 16).Value で、セルに貼り付けようとすると、bufの値のみ表示されてTextBox9の値が表示されません。 bufの値とTextBox9の値と両方をコピー表示する方法をお教えください。

  • エクセル 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 以上です。 おかしなところ満載かと思いますが、 チェックを入れた項目だけ値を入れたいと考えております。 おわかりになるかたおりましたら何卒お助けください汗 よろしくお願いいたします。

  • ユーザーフォームの値の重複登録を中止するには

    UserForm1の登録ボタン(CommandButton2)を押したときに、フォーム上の会社番号及び注文番号の二つの数値を参照して、Sheet1上の会社番号と注文番号の列から、すでに同じ会社番号で同じ注文番号が登録されてないか確認します。 例えば、フォーム上の会社番号2で注文番号104は、シート上でも会社番号2で注文番号104があるため、msgbox "既に登録済みです"を表示させて登録を中止するにはどうすれば良いでしょうか。 現状、登録ボタンを押しと時に実行させる処理は以下の通りです。 Private Sub CommandButton2_Click() Dim rc As Integer rc = MsgBox("記録を保存しますか?", vbYesNo + vbQuestion, "保存") If rc = vbYes Then If TextBox1.Value = "" Or TextBox2.Value = "" Or TextBox3.Value = "" Or TextBox4.Value = "" Then MsgBox "未入力な項目があります。" Else Dim tr As Range Set tr = Sheet1.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) tr.Offset(0, 0).Value = UserForm1.TextBox1.Value tr.Offset(0, 1).Value = UserForm1.TextBox2.Value tr.Offset(0, 2).Value = UserForm1.TextBox3.Value tr.Offset(0, 3).Value = UserForm1.TextBox4.Value MsgBox "保存しました。" End If Else MsgBox "キャンセルしました。" End If End Sub

  • マクロにおける条件文の作成の件

    以下の様に条件付きの計算式を作成しました。CommandButton3を押しても 計算しなかったり、TextBox3.Value > TextBox1 ではないときでもエラー メッセージが出ます。どこに欠点があるのか教えて下さい。 Private Sub CommandButton3_Click() Dim row As Integer If TextBox1.Value = Empty Then MsgBox ("Aが空欄です") Exit Sub End If If TextBox2.Value = Empty Then MsgBox ("Bが空欄です") Exit Sub End If If TextBox3.Value = Empty Then MsgBox ("Cが空欄です") Exit Sub End If If TextBox4.Value = Empty Then MsgBox ("Dが空欄です") Exit Sub End If If TextBox3.Value > TextBox1.Value Then MsgBox ("Cの値をAの値より小さくしましょう!") Exit Sub End If If TextBox4.Value > TextBox2.Value Then MsgBox ("Dの値をBの値より小さくしましょう!") Exit Sub End If TextBox5 = Round(TextBox1 * TextBox2 - (TextBox1 - TextBox3) * (TextBox2 - TextBox4) / 2, 0) End Sub

  • Excel ユーザーフォーム呼び出し時エラー

    WindowsVista HomePremium Excel 2007 Microsoft Visual Basic 6.5 です。 Excelでユーザーフォーム(UserForm1)を作り、   Sub Auto_Open()     UserForm1.Show   End Sub で起動時に呼び出すようにしました。 確認のため、一度Excelを閉じ起動し直したところ正常に動作しました。 もう一度確認のため同じように再起動をすると、  実行時エラー '2110': コントロールが表示されていない、利用できない、またはフォーカスを持てないため、そのコントロールにフォーカスを移すことはできません。 と出て、それ以降何度やっても動作しなくなってしまいました。 解決法か原因がわかる方いらっしゃいましたら、ぜひご教授ください。よろしくおねがいします。 ユーザーフォーム関係のコードを以下に書いておきます。(内容は小遣い帳のようなものです。) ―――――――――――――――――――― Private Sub CommandButton1_Click() Dim NUM As Integer If TextBox1.Text = "" Then MsgBox "概要が記入されていません。" TextBox1.SetFocus GoTo 100 ElseIf TextBox2.Text = "" Then MsgBox "収支が記入されていません。" TextBox2.SetFocus GoTo 100 ElseIf ComboBox1.ListIndex = -1 Then MsgBox "収支の種類が選択されていません。" ComboBox1.SetFocus GoTo 100 End If Range("F6").Select NUM = 0 Do While ActiveCell.Offset(NUM, 0) <> "" NUM = NUM + 1 Loop ActiveCell.Offset(NUM, 0).Select ActiveCell = TextBox1.Value If CheckBox1 = True Then TextBox2 = -TextBox2 End If If ComboBox1.ListIndex = 0 Or ComboBox1.ListIndex = 1 Then ActiveCell.Offset(0, ComboBox1.ListIndex + 1) = TextBox2.Value Else ActiveCell.Offset(0, ComboBox1.ListIndex + 2) = TextBox2.Value End If TextBox1 = "" TextBox2 = "" CheckBox = Falses ComboBox1.ListIndex = -1 100 End Sub ―――――――――――――――――――― Private Sub CommandButton2_Click() Dim NUM As Integer If TextBox3.Text = "" Then MsgBox "移動金額が記入されていません。" TextBox3.SetFocus GoTo 100 ElseIf ComboBox2.Text = "" Then MsgBox "移動元が選択されていません。" ComboBox2.SetFocus GoTo 100 ElseIf ComboBox3.ListIndex = -1 Then MsgBox "移動先が選択されていません。" ComboBox3.SetFocus GoTo 100 End If Range("F6").Select NUM = 0 Do While ActiveCell.Offset(NUM, 0) <> "" NUM = NUM + 1 Loop ActiveCell.Offset(NUM, 0).Select ActiveCell = "移動" If ComboBox2.ListIndex = 0 Or ComboBox2.ListIndex = 1 Then ActiveCell.Offset(0, ComboBox2.ListIndex + 1) = -TextBox3.Value Else ActiveCell.Offset(0, ComboBox2.ListIndex + 2) = -TextBox3.Value End If If ComboBox3.ListIndex = 0 Or ComboBox3.ListIndex = 1 Then ActiveCell.Offset(0, ComboBox3.ListIndex + 1) = TextBox3.Value Else ActiveCell.Offset(0, ComboBox3.ListIndex + 2) = TextBox3.Value End If TextBox3 = "" ComboBox2.ListIndex = -1 ComboBox3.ListIndex = -1 100 End Sub ―――――――――――――――――――― Private Sub CommandButton3_Click() Unload Me End Sub ―――――――――――――――――――― Private Sub CommandButton4_Click() Unload Me End Sub ―――――――――――――――――――― Private Sub UserForm_Initialize() myarray1 = Array("収支", "クレジット", "郵便局", "机", "500", "1") For i = 0 To 5 ComboBox1.AddItem myarray1(i) ComboBox2.AddItem myarray1(i) ComboBox3.AddItem myarray1(i) Next i TextBox1.SetFocus End Sub

  • If文中のExit Sub

    Dim i As String i = TextBox1.Value If i ="" Then MsgBox "入力なし" Exit Sub End If Exit Subは何の意味が有るのでしょう? Exit Subを調べたり試したりしたのですが、良く、解りません。 宜しくお願い致します。

  • VBA 空白をエラー表示させる!

    ボタンをクリックすると、入力ミスがないように MsgBoxで表示させるものを作りましたが TextBox3を都合のため切り取りました! そしたら、エラー表示され If Controls("TextBox" & i).Text = "" Then ↑黄色く表示されます! どのように下の記述を変えれば良いか教えてください! Private Sub CommandButton5_Click() Dim i As Integer For i = 1 To 9 If Controls("TextBox" & i).Text = "" Then MsgBox "判定入力していない項目がありますよ!", vbInformation, "空欄を見て!" Exit Sub End If Next If MsgBox("記録するよ?", vbOKCancel) = vbOK Then With Worksheets("グラフ") 'アセスメント身体 .Range("U2").Value = TextBox1.Value .Range("U3").Value = TextBox2.Value .Range("U4").Value = TextBox3.Value .Range("U5").Value = TextBox4.Value .Range("U6").Value = TextBox5.Value .Range("U7").Value = TextBox6.Value .Range("U8").Value = TextBox7.Value .Range("U9").Value = TextBox8.Value .Range("U10").Value = TextBox9.Value

  • エクセルの簡単なマクロ機能を追加したいのです

    既存のエクセルマクロ(Sub チェック()以下です)に下記の内容のマクロを付け足したいです。 教えていただけないでしょうか。 付け足したい条件です:  Sheet2のC列に 0  があれば  Sheet1のB列に 愛 と([太字]でセルの背景色を[灰色25%]にして)入れたいです 恐れ入りますがご存じの方がいらっしゃりましたら教えていただきたく何卒よろしくお願いいたします。 ----------------------------------------------- Sub チェック() Dim Ws1 As Worksheet Dim Ws2 As Worksheet Dim myRange1 As Range Dim myRange2 As Range Dim c1 As Range Dim c2 As Range Dim myCt As Long Set Ws1 = Worksheets("Sheet1") Set Ws2 = Worksheets("Sheet2") Set myRange1 = Ws1.Range("A1", Ws1.Cells(Rows.Count, "A").End(xlUp)) Set myRange2 = Ws2.Range("A1", Ws2.Cells(Rows.Count, "A").End(xlUp)) For Each c1 In myRange1 myCt = 0 For Each c2 In myRange2 If c2.Value = c1.Value Then If c2.Offset(, 1).Value = "" Then c1.Offset(, 1).Interior.ColorIndex = 3 Else c1.Offset(, 1).Value = c2.Offset(, 1).Value End If myCt = myCt + 1 End If Next c2 If myCt > 1 Then c1.Offset(, 1).Interior.ColorIndex = 10 Next c1 Set Ws1 = Nothing Set Ws2 = Nothing Set myRange1 = Nothing Set myRange2 = Nothing End Sub

  • EXCEL2002 VBAのループ処理について

    セルB1~B24に入力した数字を i とすると、 コマンドボタンを押したときに、セルB1~B24にの全てに値が入力されていて、 セル( F & i )が空白であれば、そこにセルA1の値を入れるようなマクロを作成しています。 セル( F & i )への入力は、セルB1~B24の全部に数値が入力されており、セル( F & i )が空白があるときのみ処理が実行されるように。どちらかが満たされない場合には、メッセージボックスを表示し、処理しないようにしたいのですが、どうしても途中まで入力されてしまいます。 以下のようなコードですが、何か良い方法はないでしょうか? Private Sub CommandButton1_Click() 'ロール確認 Dim 入力 As String, パレット As String Dim i As Long, t As Long For i = 1 To 24 入力 = Range("B" & i) パレット = Range("F" & i) If 入力 = "" Then MsgBox "aaa" Exit For End If 'パレットNo.転記 If パレット <> "" Then MsgBox "bbb" Exit For ElseIf パレット = "" Then Range("F" & 入力).Value = Range("A1").Value End If Next i End Sub

  • マクロの処理速度を上げたい

    例えば"A1"から"Z100"までランダムに数字が入っている場合に、 次の処置をしたいのです。  処理A:10以下の数値を0に置き換える。 "A1"から始まるのはほぼ決まっているのですが、 最後のセルが決まっていません。 いろいろなときに使えるように下記マクロを作りましたが、 データ量が多いのか、処理に時間がかかってしまいます。 (本番データは200×3000件くらいあり、処理も例より複雑です) 処理は行えているみたいなので、速度を上げるのにいい方法はないか 相談させてください。 プログラムの知識は基本情報処理試験のC言語を勉強していた くらいです。マクロは本を見ながら作っているので、調べきれて いない部分もあるかもしれませんが、よろしくお願いいたします。 参考にしている本は、C&R研究所のEXCEL VBAハンドブックです。 ====ここから==== sub テスト() '使用する変数  dim LastColNum as integer  dim i as integer  'A1をアクティブにします  range("A1").select  '最後の列の行番号を調べます  LastColNum=range("A1").end(xlToRight).column  'アクティブなセルが空白になるまで処理を続けます  Do Until activecell.value=""   '行数分処理を続けます   for i=0 to LastColNum-1    '10未満だったら処理をします    if activecell.offset(0,i).value<10 then     '10未満のセルに0を入力します。     activecell.offset(0.i).value=0    end if   next   '次の行をアクティブにします   activecell.offset(1,0).activate  Loop end

専門家に質問してみよう