こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

投稿日時 - 2011-07-26 21:04:43

QNo.6901475

困ってます

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

Noを「C4セルに」入力した後にmaeとtugiをクリックして上手く行かないのは,現在のmaeとtugiが,クリックされた時点で(実際のC4の値と無関係に)「trgに格納されているセル」を基準として(可視の)下や上のセルを探すマクロになっているからです。


これは裏を返すとC4に任意の番号を入力した時点で,trgに,C4に記入された番号に該当するセルを正しく格納し直してやれば良いという事です。

つまりworksheet_changeイベントの中の「case "$C$4"」のブロックの中で,trgに「番号に該当するセル」をsetし直してやれば,そのセル基準で前と次にも移動できるマクロに組み立てられます。

作成例:
set trg = Sheets("data").Cells(fRow, "A")

投稿日時 - 2011-07-27 00:03:33

お礼

keithin様

keithin様、仰るごとが理解できました。そして、狙い通りに出来ました。

今回の依頼は困難を覚悟していたので、まさかこうもすんなり行けるとは思っていませんでした。

keithin様のレベルの高さ、そしてそれに反する自分のレベルの低さを痛感しました。

経験地を積んで精進いたします。勉強になりました。ありがとうございました。

投稿日時 - 2011-07-27 00:26:15

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

trgにセルを格納して準備がなされる前にmaeやtugiを動かすと,そういうエラーになりますね。
黄色くなった状態でtrgがnothingのままになっていることを,ローカルウィンドウなどで確認してください。


対処例:
ThisWorkbookのWorkbook_Openをたとえば

Private Sub Workbook_Open()

 call saigo

End Sub

と変更してみます。

投稿日時 - 2011-07-26 21:24:15

お礼

keithin様

いつもありがとうございます。
ご返事が遅くなりすみません。アドバイス頂いた内容を理解・検証するのに色々と時間がかかってしまいました。

まず、ローカルウィンドウで nothingを確認することができました。

それと、おぉ!!。call saigo をワークブックオープンのイベントに入れると、エラーが無くなりました!最初にsaigoを動作させる必要性も理解できました。

ありがとうございます。

また、もう一つの質問なのですが、Noを手入力してから、「前へ」「後ろへ」と移動するのはやはり、無謀なチャレンジでしょうか?どういったコードを組めばいいか検討も尽きません。

もし、差し支えなければ、keithin様の見解をお聞かせ願えれば幸いです。

投稿日時 - 2011-07-26 23:25:48

あなたにオススメの質問