• 締切済み

VBA 実行時エラー91がでてしまいます。

請求書を作成する課題をしているのですが、実行時エラー91がでてしまいます。 売上シートにある受注番号セルに受注番号をを入力し、実行ボタンをおすとその受注番号とその列の受注日、宛名を請求書シートに表示させる課題です。 Private Sub 請求書作成ボタン_Click() Dim 売上, 請求書, 受注番号, 宛名, 受注日, 行 Set 売上= Sheets("売上") Set 請求書 = Sheets("請求書") 受注番号= 売上.Cells(2, 10) 請求書.Cells(8, 6) = 受注番号 行 = 売上.Range("A1,A31").Find(受注番号).Row  宛名 = 売上.Cells(行, 3)  請求書.Cells(3, 1) =宛名  受注日= 売上.Cells(行, 2)  請求書.Cells(9, 6) = 受注日 End Sub

みんなの回答

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

#3です。 質問者にとって、余分なことかもしれませんが、思いついたので、記してみます。 下記のような方法もあります。テーブルの利用です。 Range("A2:A30")のような,セル範囲の指定の仕方がなくなります。 ーー 第1行目に行を挿入し、テーブルの項目名(列名。見出し)を設定します。 参考 https://www.tschoolbank.com/excel/format-as-table/ 番号  売上日  販売先 が、▼付きで出ます。 Sub test06() Dim tb As ListObject 'Set tb = ActiveSheet.ListObjects("TestTable") Set tb = ActiveSheet.ListObjects(1) Dim 名前 As Long, 個数 As Long, 単価 As Long, 合計 As Long 番号 = tb.ListColumns("番号").Index 売上日 = tb.ListColumns("売上日").Index 販売先 = tb.ListColumns("販売先").Index Dim R As ListRow For Each R In tb.ListRows MsgBox R.Index & " " & R.Range(販売先) ’本式では、請求書の項目の代入に使う Next R End Sub

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

#1のご回答通りだろう。 ーー どうしても、自分は正しいという、思い込みがあるので、下記のようなことをやってみたら。 1からやってみることだ。 下記など、面倒くさい方法だが、他人に頼る前に、することとしては、やむを得ないだろう。本件は平凡ミスだろうが、プログラムエラーの原因発見は、読者では、そのパソコンを使っていろいろできないところから、質問コーナー問題としては適さないと思う。 ーー シート売上と請求書を作る。 サンプルデータとして 売上げシートの、J2セルに1234 たとえば、第9行目A,B,C列に 1234  2016/5/12  東京工業 コード 質問のコードに、上記XXXを修正し、Msgbox 行を、しつこいぐらい入れる。 Private Sub 請求書作成ボタン_Click() Dim 売上, 請求書, 受注番号, 宛名, 受注日, 行 Set 売上 = Sheets("売上") Set 請求書 = Sheets("請求書") MsgBox 売上.Cells(2, 10) 受注番号 = 売上.Cells(2, 10) 請求書.Cells(8, 6) = 受注番号 '行 = 売上.Range("A1,A31").Find(受注番号).Row 行 = 売上.Range("A1:A31").Find(受注番号).Row MsgBox 行 宛名 = 売上.Cells(行, 3) MsgBox 宛名 請求書.Cells(3, 1) = 宛名 受注日 = 売上.Cells(行, 2) MsgBox 受注日 請求書.Cells(9, 6) = 受注日 End Sub 実行して、出てくるMsgboxの内容と期待する内容を比べる。 その後に請求書データが思いどおりか調べる。 XXXのところを修正する前では、ここでNotFound的エラーになるだろうから、その行を集中的に考えをめぐらす。 タイプインミスなどは、時間を置いて見直す。VBAができる人が周りに居るなら、その人に一読を頼むとかやったものだ。 本件のように、どちらでもあり得るミスは、たちが悪い。 Sub test02() MsgBox Range("A8,A9").Find(1234).Row MsgBox Range("A8:A9").Find(1234).Row End Sub どちらも上記データ例では9となった。

  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.2

行 = 売上.Range("A1:A31").Find(受注番号).Row とすることで 売上.Range("A1:A31")の範囲に受注番号が見つかれば エラーになりませんが、 見つからなかった場合が考慮されていないため 指摘のエラーが起きます。 私だったら 以下のようなコードにします。 (オーソドックスなエラー処理を組み込むよりシンプルです。) また、細かな点をいくつかアドバイスします。 >Dim 売上, 請求書, 受注番号, 宛名, 受注日, 行 という記述は間違いではありませんが 後からコードを見たときの読み取りやすさ バグの温床を増やさないようにするため、  Dim 売上 As Worksheet  Dim 請求書 As Worksheet  Dim 受注番号 As Long  Dim 宛名 As String  Dim 受注日 As Date  Dim 行 As Long といった記述を行い どのような目的で使う変数なのか(型)を明示します。 > 宛名 = 売上.Cells(行, 3) この記述も間違いではありませんが、 左辺、右辺が、値なのかセル番地(の範囲)なのかが コードだけからは判断できません。 私なら、  宛名 = 売上.Cells(行, 3).Value といった記述を行い セルに埋まった値を扱っている旨明示します。 Option Explicit Private Sub 請求書作成ボタン_Click()  Dim 売上 As Worksheet  Dim 請求書 As Worksheet  Dim 受注番号 As String  Dim 宛名 As String  Dim 受注日 As Date  Dim 行 As Long  Dim 行カウンター As Long  Set 売上 = Sheets("売上")  Set 請求書 = Sheets("請求書")  受注番号 = 売上.Cells(2, 10).Value ' If IsNumeric(受注番号) = False Then '   '数値じゃなかった場合の処理 '   Exit Sub ' End If  請求書.Cells(8, 6).Value = 受注番号  行 = 0  For 行カウンター = 1 To 31   If 売上.Cells(行カウンター, 1).Value = 受注番号 Then    行 = 行カウンター    Exit For   End If  Next 行カウンター  If 行 <> 0 Then   宛名 = 売上.Cells(行, 3).Value   請求書.Cells(3, 1).Value = 宛名   受注日 = 売上.Cells(行, 2).Value   請求書.Cells(9, 6).Value = 受注日  Else   MsgBox ("受注番号が見つかりません")   'Exit Sub  End If End Sub

  • m3_maki
  • ベストアンサー率64% (296/460)
回答No.1

> 行 = 売上.Range("A1,A31").Find(受注番号).Row A1 と A31 の2つのセルしか探しませんね。 A1 から A31 までならこうです。  行 = 売上.Range("A1:A31").Find(受注番号).Row

関連するQ&A