EXCEL VBA エラーの意味が分からず

このQ&Aのポイント
  • エクセルVBAでレコードを前後に移動する際にエラーが発生し、エラーの原因と修正方法が分からない。
  • inputシートで動作を繰り返すと、実行時エラー1004が発生し、アプリケーション定義またはオブジェクト定義のエラーが表示される。
  • 写真の削除時にエラーが発生している可能性があり、エラーの回避方法を知りたい。
回答を見る
  • ベストアンサー

EXCEL VBA エラーの意味が分からず

いつも、お世話になっております。 下記コードで、レコード1と2を前へと次へを繰り返し何度か操作すると、エラーになってしまいます。なぜエラーになって、どう修正すれば回避できるのかが分かりません。 どうかご教授いただけないでしょうか。よろしくお願いいたします。 エラーの状況 inputシートで、maeとtsugiの動作を何度か行うと、「If pict.TopLeftCell.Address = targetRange.Address Then」の部分が黄色く塗りつぶされ、「実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです。」と表示されてしまします。たぶん写真の削除の時にエラーになっているのだと思いますが、 '■標準モジュールのコード。dataシートのレコードを移動し、inputシートのBC1セルに表示する。 Public trg As Range Sub Saisyo() Set trg = Worksheets("data").Range("A1") Do Set trg = trg.Offset(1, 0) Loop Until trg.EntireRow.Hidden = False Call Tenki End Sub Sub Saigo() Set trg = Worksheets("data").Range("A60000").End(xlUp) Call Tenki End Sub Sub Mae() On Error GoTo errhandle If trg.row >= 3 Then Do Set trg = trg.Offset(-1, 0) Loop Until trg.EntireRow.Hidden = False If trg.row = 1 Then MsgBox "これより前のレコードはありません" Call Saisyo Exit Sub Else Call Tenki End If Else MsgBox "これより前のレコードはありません!" End If Exit Sub errhandle: Call Saisyo End Sub Sub Tsugi() On Error GoTo errhandle If trg.row < Worksheets("data").Range("A60000").End(xlUp).row Then Do Set trg = trg.Offset(1, 0) Loop Until trg.EntireRow.Hidden = False Call Tenki Else MsgBox "これより後ろのレコードはありません" End If Exit Sub errhandle: Call Saigo End Sub Sub Tenki() Worksheets("input").Range("BC1").Value = trg.Offset(0, 0) End Sub '■sheet 1のモジュール。inputシートBC1セルの値を見て、dataシートへ値を読みにいき、inputシートへ表示する。 Private Sub hyouji() Dim fRange As Range Dim kensaku As Long Set fRange = Sheets("data").Columns(1).Find(What:=Range("BC1").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) If (fRange Is Nothing) Then '見つからなかった? MsgBox "入力された顧客コードが存在しません。", vbExclamation Exit Sub End If kensaku = fRange.row '検索された顧客DCの行位置を求める Range("BC1:BE1").Value = Sheets("data").Cells(kensaku, 1).Value '整理No Range("AX1").Value = Sheets("data").Cells(kensaku, 2).Value '固有ID Range("I4").Value = Sheets("data").Cells(kensaku, 3).Value '工場名 Range("P4").Value = Sheets("data").Cells(kensaku, 4).Value '柱No Range("W4").Value = Sheets("data").Cells(kensaku, 5).Value '盤No Range("I5").Value = Sheets("data").Cells(kensaku, 6).Value '変台系統1 Range("S5").Value = Sheets("data").Cells(kensaku, 7).Value '変台系統2 Range("I6").Value = Sheets("data").Cells(kensaku, 8).Value '分電盤設置時期 Range("B8").Value = Sheets("data").Cells(kensaku, 9).Value '主な供給先 Range("B14").Value = Sheets("data").Cells(kensaku, 10).Value '特記 Range("AD4").Value = Sheets("data").Cells(kensaku, 11).Value '盤位置の目安 Range("AT8").Value = Sheets("data").Cells(kensaku, 12).Value '幹線線相 Range("R36").Value = Sheets("data").Cells(kensaku, 13).Value '盤写真ファイル名 Range("AT36").Value = Sheets("data").Cells(kensaku, 14).Value '単結図ファイル名 End Sub '■sheet 1のモジュール。"$R$36"と"$AT$36"の写真ファイル名を見て、"C37"と"AE37"セルに表示させる。 Private Sub Worksheet_Change(ByVal Target As Range) Dim fRange As Range Dim touroku As Long Select Case Target.Address Case "$BC$1" Call hyouji Case "$R$36" myLoadPicture "board_Image", Target.Text, Range("C37") Case "$AT$36" myLoadPicture "map_Image", Target.Text, Range("AE37") Case "$AT$8" Call red_circle Case Else Exit Sub End Select End Sub Private Sub myLoadPicture(folderName As String, fname As String, targetRange As Range) Dim pict As Shape, picPath As String picPath = ThisWorkbook.Path & "\" & folderName & "\" & fname If fname = "" Then picPath = ThisWorkbook.Path & "\" & folderName & "\" & "NoImage.jpg" End If With ActiveSheet For Each pict In .Shapes If pict.TopLeftCell.Address = targetRange.Address Then pict.Delete Exit For End If Next pict Set pict = .Shapes.AddPicture(picPath, msoTrue, msoFalse, _ targetRange.Left, targetRange.Top, 300, 360) End With End Sub

  • puyopa
  • お礼率87% (459/525)

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

  • ベストアンサー
  • MRT1452
  • ベストアンサー率42% (1392/3296)
回答No.5

"具体的なコード"といわれましても、()書きの部分が適当な命令文に置き換わるだけですが(汗 エラー処理の部分だけで言えば、記述自体は間違っていませんよ。 まぁ、できればON ERRORの宣言は一番最初にした方が良いかと。 ただ、前述でも注意書きしたと思いますが、エラー用に設けたラベルの前にExit Subの記述が見受けられません。 この措置をしないと、正常に処理した場合でもエラー用の処理を行ってしまい、 正常であっても「写真が読み込めませんでした」というメッセージが表示されることになります。 (前略) End With Exit Sub  ←これが無い(他のExit~同様、ここでSubを抜ける(→本関数を終了する)という意味) errMSG: MsgBox "写真が読み込めませんでした" End Sub 他の方も書かれていますが。 まずはデバッグや、ブレイクポイントを付けて、プログラムを途中で止め、 それぞれのオブジェクトや変数に異常がないか(本来貴方が予想している値になっているか)等を 確認した方が良いかと。

puyopa
質問者

お礼

MRT1452様 度重なる浅はかな質問にも、ご親切に回答いただき誠にありがとうございます。 NO4の回答者様にもご指摘頂いたとおり、今後は質問する前に自分で確認をしっかりするように努めます。 色々と参考になりました。ありがとうございました。

その他の回答 (4)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.4

なんとか課題をクリアしようという熱意は評価いたしますが、回答者に長いリストを読ませるのではなく、課題を単純化して、問題箇所を絞るスキルを身につけていただきたいと希望します。当方、全文を読んではおりません。 If pict.TopLeftCell.Address = targetRange.Address でエラーが出るとの事ですが、右辺はActivesheetのセル決め打ちなので、ワークシートのチェンジイベントで動かしている以上、問題にはならないと思います。とすると、問題が起きる時の左辺が何かというのが気になります。 コードを斜め読みした限りでは、写真以外にshapeがいくつかある様ですね。 エラー箇所の直前に、 debug.print pict.name,pict.type とかして、どんなshapeが問題を起こすのか確認なさってください。 Addpictureした写真のみを対象にするには、 With ActiveSheet For Each pict In .Shapes If pict.Type = msoLinkedPicture Then If pict.TopLeftCell.Address = targetRange.Address Then pict.Delete End If Exit For End If Next pict などとすれば良いと思います。 写真のshape.typeは、msopicture=13かと思いましたが、当方で確認したところではmsoLinkedPicture=11でした。 なお、当方xl2000です。

puyopa
質問者

お礼

mitarashi様 回答誠にありがとうございます。 そして、全くもって面目ございません。まさしくご指摘の通りであり、自身反省・自重し、無駄に長い投稿を控えるように致します。 作成にあたり、色んなプレッシャーがあり、また誰にも聞くことができず、藁にもすがる思いでなりふり構わずだったところがあると自覚いたしております。 完全には理解できませんでしたが、参考になりました。アドバイスいただいたとおり確認を致します。 ありがとうございました。

  • MRT1452
  • ベストアンサー率42% (1392/3296)
回答No.3

なんか自分は見当違いな所を見ていたようで。 それはともかくとして。 エラーが発生した場合にプログラム止めないようにする(と言うよりはエラー時の対応処理)には、 例外処理を行うようにします。 端的に、エラーが起きたときに、システムに替わってプログラムがこのように対応しますよということを、 プログラムで明示する方法。 多くの場合は、ON ERRORでエラーを拾うという方法。 自分の場合はON ERROR GOTOを用いて、 Sub AAA() ON ERROR GOTO EXP ・・・EXPはラベル名(任意名) (正常処理) Exit Sub EXP: ・・・ラベル名: でラベルとして認識されます。 (例外エラー発生時の処理) End Sub これで、例外エラーをプログラムとして拾うので、一部の重大な例外を除き、エラーをスルーできます。 ただし、これはプログラムとして拾うようにするだけなので、考えて作らないと、 エラーとしてシステムを止めないといけないのに、そのまま流れてしまって重大なデータ破損が起きてしまうという事も考えられます。 通常は 例外エラーを拾ったら、 msgbox(Err.Description) 等で、システムが吐き出す例外エラーの出力を代行するという形を取ると良いかと。 また例外エラー発生時に移動先として指定するラベルの前に、 Exit Subをつけて、正常処理が例外処理に入ってこない様にする工夫も必要です。 ON ERROR GOTOはあくまでエラーがおきたら、指定したラベルに飛ぶというだけの意味で、 プログラム自体は、指定ラベルを例外専用のラベルとは認識しません。 ただ、エラー発生時にソースに飛んだりしないので、ON ERRORは利用価値は高いと思います。 逆にデバッグ時にはネックになったりすることもありますが。 (作り方によっては、エラーが発生しても、正常終了したかのように見せ掛ける事も可能なので)

puyopa
質問者

お礼

回答ありがとうございます。 誠に申し上げにくいのですが、出来れば、具体的なコードでアドバイスを頂けるとありがたいです。 甘えてばかりではいけないので、自分なりに調べてコードをon errorのコードを盛り込んでみたのですが、 下記コードだと、逆にメッセージばかりが出てしまいます。 Private Sub myLoadPicture(folderName As String, fname As String, targetRange As Range) Dim pict As Shape, picPath As String On Error GoTo errMSG picPath = ThisWorkbook.Path & "\" & folderName & "\" & fname If fname = "" Then picPath = ThisWorkbook.Path & "\" & folderName & "\" & "NoImage.jpg" End If With ActiveSheet For Each pict In .Shapes If pict.TopLeftCell.Address = targetRange.Address Then pict.Delete Exit For End If Next pict Set pict = .Shapes.AddPicture(picPath, msoTrue, msoFalse, _ targetRange.Left, targetRange.Top, 300, 360) End With errMSG: MsgBox "写真が読み込めませんでした" End Sub

  • mks1902
  • ベストアンサー率40% (11/27)
回答No.2

If pict.TopLeftCell.Address = targetRange.Address Then pict.Delete pict.Deleteのところが改行さてます。 If pict.TopLeftCell.Address = targetRange.Address Then pict.Delete

puyopa
質問者

お礼

回答ありがとうございます。 >pict.Deleteのところが改行さてます。 >If pict.TopLeftCell.Address = targetRange.Address Then pict.Delete ご指摘頂いた内容で修正させて頂きましたところ、今度は「コンパイルエラー End ifに対応するIfブロックがありません。」と表示されるようになってしまいました。 またご確認頂ければと思います。

  • MRT1452
  • ベストアンサー率42% (1392/3296)
回答No.1

該当の命令等はわかりませんが、 まずは、左辺、右辺とも、ちゃんと値が取得できているか確認。 (どちらが問題となっているのかの特定) 見る限りセル位置のプロパティ等みたいなので、そこの座標情報に0とか有りえ無い位置情報が入ると、 1004エラーになったりするみたいですが。 自分がShapeに関して全然わからないというのもありますが、 他、気になるのは、targetRangeがWorksheet下のRangeだとして、そのRangeと Shape下のRangeを返すTopLeftCellが同じ扱いが出来るのかとか。 1004エラーはたしか、オブジェクト上での何らかの不整合でも起きるエラーなので。 どこでコケているか等の切り分けをしないと原因を探すのは結構難しいかと。

puyopa
質問者

お礼

ありがとうございます。正直今の私の実力では、原因究明と修正は出来そうもありません。 そこでエラーが起こった場合に、リロード(再読み込み)するか、exit sub する方法(コード)をアドバイスいただけると有り難いです。 せっかく回答を頂けたのに、ご無理いって申し訳ございません。

関連するQ&A

  • Excel VBAデータ登録のスピードアップしたい

    下記のようなコードがあります。 ■input データ閲覧・登録・編集シート ■data データを格納するシート inputシートとdataシートでdataの受け渡しを行っているのですが、データレコードを切り替えるだけで20秒ちょっとかかるため、作業効率が悪いです。 この時間を1~2秒ぐらいまで減らすには、どのように修正すれば、いいでしょうか?どうかアドバイスをお願いいたします。 Private Sub datatouroku() ’データを登録する Dim touroku As Integer Dim fRange As Range Set fRange = Sheets("data").Columns(1).Find(What:=Range("BC1").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) touroku = fRange.Row '検索されたNoの行位置を求める Sheets("data").Cells(touroku, 1).Value = Range("BC1:BE1").Value Sheets("data").Cells(touroku, 2).Value = Range("AX1").Value Sheets("data").Cells(touroku, 3).Value = Range("I4").Value   '・・・上記のデータが全部で256件あります。 End Sub ------------------------------------------ Private Sub hyouji() 'データを表示させる Dim fRange As Range Dim kensaku As Long Set fRange = Sheets("data").Columns(1).Find(What:=Range("BC1").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows)    If (fRange Is Nothing) Then '見つからなかった?    MsgBox "入力された顧客コードが存在しません。", vbExclamation    Exit Sub    End If    kensaku = fRange.Row '検索された顧客DCの行位置を求める     Range("BC1:BE1").Value = Sheets("data").Cells(kensaku, 1).Value     Range("AX1").Value = Sheets("data").Cells(kensaku, 2).Value    Range("I4").Value = Sheets("data").Cells(kensaku, 3).Value     '・・・上記のデータが全部で256件あります。 Set trg = Sheets("data").Cells(kensaku, 1) End Sub

  • excel VBA コードの編集 アドバイス依頼

    いつもお世話になっております。 初心者ですが、苦しみながらもaccessを意識したデータベースをexcelで作成しようとしております。 さて 下記 Worksheet_シートが2つあり、それぞれのシートで IDを関連付ける主キーにしてデータを管理しています。 ■1枚目「input」シート ・・・ データを入力・閲覧するシート(accessでいうフォームにあたります)、主キーはC4セルに入力しています。 ■2枚目「data」シート ・・・ inputシートで入力・編集されたデータを保管するするシート(accessでいうとテーブルにあたります)。主キーはA列に登録されています。 ■データの閲覧方法 ・・・inputシートに、「最初へ」「前へ」「次へ」「最後へ」と4つのボタンをinputシートに設けて、主キー番号を可変させてデータを閲覧できるようにしています。また、C4セルに直接数字を入力しても、データをdataシートへ読みにいって、表示させられるようにしています。 ■困っていること、 ・・・C4セルに数字を打ち込んでデータを閲覧した後、「前へ」「次へ」ボタンを押すと、エラー(オブジェクト変数または、withブロック・・・)または、全く違う番号にジャンプしてしまいます。 ■お願いしたいこと ・・・C4セルに数字を打ち込んでデータを閲覧した後、、「前へ」「次へ」ボタンを押して、その前後のデータが確認できるようなコードに修正したいのですが、どういったコードにすればいいか教えていただけないでしょうか? コードは下記です。 また、どういったものを作ろうとしているのか説明不足でご指摘を頂戴することもありますので、試作段階のファイルですが、アップローダーにあげさせていただきました。確認頂ければ幸いです。 ■アプロダ 投稿No 4520 http://www.kent-web.com/pubc/book/test/uploader/uploader.cgi ■↓以下 関係あると思われるコード抜粋です '■レコードの移動コード(標準モジュールに記載) Public trg As Range Sub Saisyo() Set trg = Worksheets("data").Range("a1") Do Set trg = trg.Offset(1, 0) Loop Until trg.EntireRow.Hidden = False Call Tenki End Sub Sub Saigo() Set trg = Worksheets("data").Range("A60000").End(xlUp) Call Tenki End Sub Sub Mae() If trg.row >= 3 Then Do Set trg = trg.Offset(-1, 0) Loop Until trg.EntireRow.Hidden = False If trg.row = 1 Then MsgBox "これより前のレコードはありません" Call Saisyo Exit Sub Else Call Tenki End If Else MsgBox "これより前のレコードはありません!" End If End Sub Sub Tsugi() If trg.row < Worksheets("data").Range("A60000").End(xlUp).row Then Do Set trg = trg.Offset(1, 0) Loop Until trg.EntireRow.Hidden = False Call Tenki Else MsgBox "これより後ろのレコードはありません" End If End Sub Sub Tenki() Worksheets("input").Range("c4").Value = trg.Offset(0, 0) End Sub '■ワークシートチェンジコード(ワークシートに記載) Private Sub Worksheet_Change(ByVal Target As Range) Dim fRange As Range Dim fRow As Long Select Case Target.Address Case "$C$4" Set fRange = Sheets("data").Columns(1).Find(What:=Range("C4").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) If (fRange Is Nothing) Then '見つからなかった? MsgBox "入力された顧客コードが存在しません。", vbExclamation Exit Sub End If fRow = fRange.row '検索された顧客DCの行位置を求める Range("F4").Value = Sheets("data").Cells(fRow, 2).Value Range("C5").Value = Sheets("data").Cells(fRow, 3).Value Range("C6").Value = Sheets("data").Cells(fRow, 4).Value Range("C7").Value = Sheets("data").Cells(fRow, 5).Value Range("F5").Value = Sheets("data").Cells(fRow, 6).Value Range("k4").Value = Sheets("data").Cells(fRow, 7).Value Range("k17").Value = Sheets("data").Cells(fRow, 8).Value Case "$K$4" myLoadPicture "board_Image", Target.Text, Range("I5") Case "$K$17" myLoadPicture "map_Image", Target.Text, Range("I18") Case Else Exit Sub End Select End Sub

  • excel vba のエラー原因が分かりません

    データ入力シート「Hit Data] データ表示シート「User Sheet」 とあります。 データ表示シート「User Sheet」に「次へ」「前へ」「最初へ」「最後へ」とボタンをつくり、データ入力シート「Hit Data]から、都度データを呼び出せるようにするプログラムをとあるサイトを参考にして作成しましたが、エラーが出てしまいどうしてもうまくいきません。 どこに問題があるのか見ていただけないでしょうか? '以下標準モジュールのプログラムです Public trg As Range Sub Saisyo()  Set trg = Worksheets("Hit Data").Range("A3")  Call Tenki End Sub Sub Saigo()  Set trg = Worksheets("Hit Data").Range("A60000").End(xlUp)  Call Tenki End Sub Sub Mae()  If trg.Row >= 4 Then   Set trg = trg.Offset(-1, 0)   Call Tenki  Else   MsgBox "これより前のレコードはありません"  End If End Sub Sub Tsugi()  If trg.Row < Worksheets("Hit Data").Range("A60000").End(xlUp).Row Then   Set trg = trg.Offset(1, 0)   Call Tenki  Else   MsgBox "これより後ろのレコードはありません"  End If End Sub Sub Tenki()  Worksheets("User Sheet").Range("D9").Value = trg.Offset(0, 0)  Worksheets("User Sheet").Range("D10").Value = trg.Offset(0, 1)  Worksheets("User Sheet").Range("D11").Value = trg.Offset(0, 2)  Worksheets("User Sheet").Range("D12").Value = trg.Offset(0, 3) End Sub '以下 User Sheet"のシートモジュールに記載されたプログラムです。 Private Sub Worksheet_Activate() Call Saisyo End Sub '表示されるエラーの内容 'saisyo・・・アプリケーション定義またはオブジェクト定義のエラーです。 'saigo・・・同上 'mae・・・オブジェクト変数またはWithブロック変数が設定されていません 'tugi・・・同上

  • excel VBA 2つのプロシージャを1つに

    いつもお世話になっております。 初心者ですが、苦しみながらもexcelでデータベースを作成しております。 さて Worksheet_Change のイベントが2つあり、これを一つにまとめようとしているのですが、がんばっているんですが、自分ではどうしてもうまくいかない為、投稿させていただきました。 コードは下記2つです。 また、どういったものを作ろうとしているのか説明不足でご指摘を頂戴することもありますので、試作段階のファイルですが、アップローダーにあげさせていただきました。確認頂ければ幸いです。 ■アプロダ 投稿No 4514 http://www.kent-web.com/pubc/book/test/uploader/uploader.cgi ■作ろうとしているデータベースの概要 inputシート・・・データを直接入力して、また、データや写真を閲覧をするシート dataシート・・・データを格納するシート、オートフィルタを使って、曖昧検索フィルタもここでかけたりします。 どうか良いお知恵を拝借させていただきたくよろしくお願いします。 '一つ目のプロシージャ(Noセルに数字が入ると、そのNoのデータを自動的にdataシートまで読みにいって表示させます) Private Sub WorkSheet_Change(ByVal Target As Range) 'No入力してデータ反映 Dim fRange As Range Dim fRow As Long If Target.row <> 4 Then Exit Sub If Target.Column <> 3 Then Exit Sub Set fRange = Sheets("data").Columns(1).Find(What:=Range("C4").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) If (fRange Is Nothing) Then '見つからなかった? MsgBox "入力された顧客コードが存在しません。", vbExclamation Exit Sub End If fRow = fRange.row '検索された顧客DCの行位置を求める Range("F4").Value = Sheets("data").Cells(fRow, 2).Value Range("C5").Value = Sheets("data").Cells(fRow, 3).Value Range("C6").Value = Sheets("data").Cells(fRow, 4).Value Range("C7").Value = Sheets("data").Cells(fRow, 5).Value Range("F5").Value = Sheets("data").Cells(fRow, 6).Value End Sub '二つ目のプロシージャ(写真を表示させるためのコードです) Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Address Case "$k$4" myLoadPicture "board_Image", Target.Text, Range("I5") Case "$K$17" myLoadPicture "map_Image", Target.Text, Range("I18") Case Else Exit Sub End Select End Sub

  • VBAのコードを見ていただけませんか

    いつも、ここのサイトの方々には大変お世話になっております。ありがとうございます。 さてexcel2000で、dataというフォームにデータを格納し、メインのシートから、読みに行って編集するデータベースを作成しようとしています。 とあるサイトを参考にして、コードを作成しましたが、いくら頑張ってもどうしてもエラーが出てしまいうまくいきません。 どうか、コードのチェック・修正内容の提案等をいただけないでしょうか?よろしくお願いいたします。 (1)自分で登録した「IDが見つかりません」という表示しかでず、登録が出来ない (2)dataシートのB列(2列目)が主キー(IDと呼んでいます) です。(メインのシートとデータを照合させる部分) (3)メインのシートのIDはAL1~AQ1行セルまでを結合したセルに保管しています。 (4)下記コードでCommandButton1ボタンを「登録」と命名し、メインシートで入力したデータをdataシートに変更登録、新規に入力したデータも登録できるようにしたい。 (5)スピンボタンでIDを変化させて、メインフォーム上のデータも変化させたいけど、こちらも同種のエラーが出てしまう。 ■以下コードです。 Private Sub CommandButton1_Click() Dim fRange As Range Dim fRow As Long If (Range("AL1").Value = "") Then 'IDが入力されていない場合 MsgBox "IDを入力して下さい", vbExclamation Exit Sub End If Set fRange = Sheets("data").Columns(2).Find(What:=Range("AL1").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) If (fRange Is Nothing) Then 'IDが見つからなかった場合 MsgBox "IDが見つかりません", vbExclamation Exit Sub End If fRow = fRange.row 'IDの行位置を求める Sheets("data").Cells(fRow, 1).Value = Range("AZ1:BE1").Value Sheets("data").Cells(fRow, 2).Value = Range("AL1").Value Sheets("data").Cells(fRow, 3).Value = Range("AA1:AO1").Value Sheets("data").Cells(fRow, 4).Value = Range("D5:E5").Value Sheets("data").Cells(fRow, 5).Value = Range("G5").Value Sheets("data").Cells(fRow, 6).Value = Range("I5").Value Sheets("data").Cells(fRow, 7).Value = Range("D5:F7").Value Sheets("data").Cells(fRow, 8).Value = Range("G6:I7").Value Sheets("data").Cells(fRow, 9).Value = Range("E8:E9").Value Sheets("data").Cells(fRow, 10).Value = Range("G8:G9").Value Sheets("data").Cells(fRow, 11).Value = Range("B11:I24").Value Sheets("data").Cells(fRow, 12).Value = Range("B71").Value Sheets("data").Cells(fRow, 13).Value = Range("C71").Value Sheets("data").Cells(fRow, 14).Value = Range("B73").Value Sheets("data").Cells(fRow, 15).Value = Range("C73").Value Sheets("data").Cells(fRow, 16).Value = Range("B75").Value Sheets("data").Cells(fRow, 17).Value = Range("C75").Value   ’・・・・全部でfRow122まであります End Sub

  • VBA で2つのプロシージャを一つにまとめたい

    いつもここにはお世話になっており、ありがとうございます。 さて、タイトルにもありました通り、下記2つのプロシージャでコマンドボタンを設定して、実行しておりますが、これを一つのプロシージャ(ボタン)にまとめたく、ご指導お願いいたします。 ○作ろうとしているVBAの概要 1)EXCELのデータベースで、一枚目の「inputシート」に入力し、2枚目の「dataシート」でデータをどんどん格納していきます。 2)データは、「顧客CDボタン」で管理しており、これをキーとしています。 3)「顧客CD」は[inputシート」ではC4セル、「dataシート」ではA列にで管理しています。 3)データは新規にデータを入力したときの登録ボタン(一つ目のプロシージャ)、既存のデータを編集して、上書きするときの、変更登録ボタン(二つ目のプロシージャ)があります。 ○相談したい内容 「登録ボタン」と「変更」ボタンを一つにまとめて、ひとつのボタンとして、新規にデータを登録するときも、変更したデータを登録するときも、同じボタンで行えるようにしたい。 '■1つ目のプロシージャー Private Sub CommandButton1_Click() '登録ボタン Dim row As Integer row = WorksheetFunction.CountA(Sheets("data").Columns(1)) Sheets("data").Cells(row, 2).Value = Range("C5").Value row = WorksheetFunction.CountA(Sheets("data").Columns(1)) Sheets("data").Cells(row, 3).Value = Range("C6").Value row = WorksheetFunction.CountA(Sheets("data").Columns(1)) Sheets("data").Cells(row, 4).Value = Range("C7").Value row = WorksheetFunction.CountA(Sheets("data").Columns(1)) Sheets("data").Cells(row, 5).Value = Range("F5").Value ActiveWorkbook.Save End Sub '■2つ目のプロシージャー Private Sub CommandButton3_Click() '変更ボタン Dim fRange As Range Dim fRow As Long If (Range("C4").Value = "") Then '顧客CDが入力されていない? MsgBox "顧客コードを入力してください。", vbExclamation Exit Sub End If Set fRange = Sheets("data").Columns(1).Find(What:=Range("C4").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) If (fRange Is Nothing) Then '見つからなかった? MsgBox "入力された顧客コードが存在しません。", vbExclamation Exit Sub End If fRow = fRange.row '検索された顧客DCの行位置を求める Sheets("data").Cells(fRow, 2).Value = Range("C5").Value Sheets("data").Cells(fRow, 2).Value = Range("C5").Value Sheets("data").Cells(fRow, 2).Value = Range("C5").Value Sheets("data").Cells(fRow, 3).Value = Range("F5").Value

  • エクセルのVBAで、エラーになった場合の回避

    excel2000 VBA エラーが発生した場合の処理の方法についてアドバイスをお願いいたします。 データベースのレコードを操作する、4つのプロシージャが下記の通りあります。 (1)最初(saisyo) (2)最後(saigo) (3)前(mae) (4)次(tugi) いきなり、(3)前、(4)次の処理を実行すると、エラーになってしまうのですが、これをなくしたい。(on error gotoステートメントを使えばいいのかなと考えていますが) ワークブックオープン時のイベントで(2)最後(saigo)を呼び出しているので、基本的にエラーは出ないのですが、いろいろレコードを触っている時に、(3)、(4)を実行するとエラーになるのがわずらわしいです。 どういう修正をコードに加えればいいか、アドバイスいただけるとありがたいです。 Public trg As Range Sub Saisyo() Set trg = Worksheets("data").Range("A1") Do Set trg = trg.Offset(1, 0) Loop Until trg.EntireRow.Hidden = False Call Tenki End Sub Sub Saigo() Set trg = Worksheets("data").Range("A60000").End(xlUp) Call Tenki End Sub Sub Mae() If trg.row >= 3 Then Do Set trg = trg.Offset(-1, 0) Loop Until trg.EntireRow.Hidden = False If trg.row = 1 Then MsgBox "これより前のレコードはありません" Call Saisyo Exit Sub Else Call Tenki End If Else MsgBox "これより前のレコードはありません!" End If End Sub Sub Tsugi() If trg.row < Worksheets("data").Range("A60000").End(xlUp).row Then Do Set trg = trg.Offset(1, 0) Loop Until trg.EntireRow.Hidden = False Call Tenki Else MsgBox "これより後ろのレコードはありません" End If End Sub Sub Tenki() 'レコードのtrgの値を入力シート(input)のBC1セルに表示させる Worksheets("input").Range("BC1").Value = trg End Sub

  • excel VBA のエラー回避のアドバイス依頼

    いつもお世話になります。 EXCEL2000のVBAで、エラーになった場合の修正(回避コード)を教えていただきたくよろしくお願いいたします。 ここでは、とあるブックのSheet1のH25セルに写真のファイル名を入れます。そして、実際の写真を ブックが保管してあるフォルダ内のboard_image というフォルダに入れて、マクロを実行すると、C26セルに写真が表示されるというものですが。 ここで、C26セルが空白だと「実行時エラー'1004!; 指定したファイルが見つかりませんでした。」と言われます。 これを回避して、「NoImage.jpg」という名前の写真を表示させるようにしたいです。 アドバイスお願いします。 '■↓コードは下記です。 Private Sub Worksheet_Change(ByVal Target As Range) Dim fRange As Range Dim touroku As Long Select Case Target.Address Case "$H$25" myLoadPicture "board_Image", Target.Text, Range("C26") Case Else Exit Sub End Select End Sub Private Sub myLoadPicture(folderName As String, fname As String, targetRange As Range) Dim pict As Shape, picPath As String picPath = ThisWorkbook.Path & "\" & folderName & "\" & fname If Dir(picPath) = "" Then picPath = ThisWorkbook.Path & "\" & folderName & "\" & "NoImage.jpg" End If With ActiveSheet For Each pict In .Shapes If pict.TopLeftCell.Address = targetRange.Address Then pict.Delete Exit For End If Next pict Set pict = .Shapes.AddPicture(picPath, msoTrue, msoFalse, _ targetRange.Left, targetRange.Top, 300, 360) End With End Sub

  • excel vbaの修正でアドバイスお願いします

    excel2000を利用しています。 下記のとあるプロシージャで自分で修正を試みるもどうしても出来ず投稿させていただきました。 どうか修正内容のアドバイスをお願いします。 ■やろうとしていること 下記は写真を表示させる部分のコードです。下記 「worksheetchange」 イベントプロシージャで、レコードが変わると下記「myLoadPicture」が発生し、写真を表示させて、レコードを切り替えるたびに、その写真を切り替えるというものです。 ■相談したいこと いま指定したセルが空白だと、"NoImage.jpg"が表示されるようになっていますが、指定したフォルダに一致するファイルがなかった場合も、"NoImage.jpg"が表示されるようにしたいのですが、修正方法がわかりません。 どうかご教授お願いいたします。 Private Sub Worksheet_Change(ByVal Target As Range) Dim fRange As Range Dim touroku As Long Select Case Target.Address Case "$BC$1" Call hyouji Case "$BW$1" myLoadPicture "board_Image", Target.Text, Range("BH3") Case "$CY$1" myLoadPicture "circuit_Image", Target.Text, Range("CJ3") Case Else Exit Sub End Select End Sub Private Sub myLoadPicture(folderName As String, fname As String, targetRange As Range) On Error Resume Next Dim pict As Shape, picPath As String picPath = ThisWorkbook.Path & "\" & folderName & "\" & fname If fname = "" Then picPath = ThisWorkbook.Path & "\" & folderName & "\" & "NoImage.jpg" End If With ActiveSheet For Each pict In .Shapes If pict.TopLeftCell.Address = targetRange.Address Then pict.Delete Exit For End If Next pict Set pict = .Shapes.AddPicture(picPath, msoTrue, msoFalse, _ targetRange.Left, targetRange.Top, 260, 320) End With Exit Sub End Sub

  • excel VBA コード編集のアドバイス

    下記データベースをexcelで作成しようとしています。 ■「data」シート ・・・データを入力するシート ■「input]シート ・・・データを入力してdataシートに格納する、またdataシートで入力した値をほしい情報を表示させるシート ■やろうとしていること、困っていること ・・・dataシートのA列でID番号を入力しておりますが、dataシートでオートフィルタを使う場合があり、その場合、IDが飛び飛びになるのですが、下記コマンドボタンだと、それに合わせて飛んでくれません。 ■相談したいこと これを解決するために、オフセットでは、無理ということは分かるのですが、じゃぁどういったコードを組めばいいのかをアドバイスをお願いできないでしょうか。どうかよろしくお願いいたします。 '■以下コードです。 Public trg As Range Sub Mae() '前へのボタン If trg.row >= 3 Then Set trg = trg.Offset(-1, 0) Call Tenki Else MsgBox "これより前のレコードはありません" End If End Sub Sub Tsugi() '次へのボタン If trg.row < Worksheets("data").Range("A60000").End(xlUp).row Then Set trg = trg.Offset(1, 0) Call Tenki Else MsgBox "これより後ろのレコードはありません" End If End Sub Sub Tenki() Worksheets("input").Range("c4").Value = trg.Offset(0, 0) End Sub

専門家に質問してみよう