下記の質問の続きです。Accessのフォームにテキストボックスをつけます。日付のみテキストボックスで入力できるようにします。ボタンを押すと、入力したテキストボックスの日付以降をテーブルに挿入したいです。

http://q.hatena.ne.jp/1238561501
例えばテキストボックスに10/1と入力します。ボタンを押すとExcelのA列を参照して10/1が最初に出てくればそれ以降の行を見てテーブルへの挿入をしたいと思っています。どのように実現すればよいでしょうか?またテキストボックスに日付以外を挿入できないようにするにはどのようにしたらよいでしょうか?

回答の条件
  • 1人2回まで
  • 登録:2009/04/01 14:18:31
  • 終了:2009/04/08 14:20:02

回答(1件)

id:SALINGER No.1

SALINGER回答回数3454ベストアンサー獲得回数9692009/04/01 17:34:28

ポイント60pt

フォームに追加したボタン名はコマンド1、テキストボックス名はテキスト0としています。

ボタンのClickイベントで日付かどうかを判断し、日付の場合はデータを取得するプロシージャに渡します。

Option Compare Database

Private Sub コマンド1_Click()
    'テキストボックスが日付に変換できるかをチェック
    If Not IsDate(テキスト0.Value) Then
        MsgBox "日付を入力してください"
    Else
        Call AddXls(DateValue(テキスト0.Value))
    End If
End Sub

Sub AddXls(myDate2 As Date)
    Dim DB As DAO.Database
    Dim RS As DAO.Recordset
    Dim appExcel As Object
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim j As Integer
    Dim myDate As Date
    Dim myID As String
    Dim myMoney As Long
    Dim myText As String
    Dim f As Boolean
    
    Set DB = CurrentDb
    'テーブル名はTestTableとしました
    Set RS = CurrentDb.OpenRecordset("TestTable")

    'エクセルファイルのパスを指定
    Set appExcel = GetObject("C:\Documents and Settings\hogehoge\デスクトップ\test.xls")
    
    'シート名をマイシートとしました
    Set ws = appExcel.Worksheets("マイシート")

    '作業中はエクセルシートを非表示
    appExcel.Parent.Windows(appExcel.Name).Visible = False

    '最終行の取得(マネー列を使用しました)
    lastRow = ws.Cells(ws.Rows.Count, 3).End(xlup).row
    
    '日付データの比較から、行の取得
    For i = 10 To lastRow
        If ws.Cells(i, 1).Value <> "" Then
            myDate = ws.Cells(i, 1).Value
        End If
        
        If myDate >= myDate2 Then
            f = True
            Exit For
        End If
    Next i
    
    'Excelからデータの取得
    If f Then
        For j = i To lastRow
            If ws.Cells(j, 1).Value <> "" Then
                myDate = ws.Cells(j, 1).Value
            End If
            If ws.Cells(j, 2).Value <> "" Then
                myID = ws.Cells(j, 2).Value
            End If
            myMoney = ws.Cells(j, 3).Value
            myText = ws.Cells(j, 4).Value
            
            'レコードセットに追加
            RS.AddNew
            RS.Fields(0) = myDate
            RS.Fields(1) = myID
            RS.Fields(2) = myMoney
            RS.Fields(3) = myText
            RS.Update
        Next
    End If
    
    appExcel.Parent.Windows(appExcel.Name).Visible = True
    
    'エクセルブックを閉じる
    appExcel.Close True
    
    ' オブジェクトの参照を解放
    Set ws = Nothing
    Set appExcel = Nothing
    
    MsgBox ("エクセルの読み込みが終了しました")

End Sub
id:akaired

ご回答ありがとうございます。説明下手で申し訳ございません。一番しりたいのはA列で指定の日付が最初にでてくる所の行数がしりたいです。そこの処理だけでありがたいです。例えばA列全選択して指定の日付を検索(もじくは文字列)。ヒットした文字列の一番最初の行数を得たいです。

例えば10/10を指定します。A列の100行目から110行目にかけて10/10が入力されていたとします。一番最初に100行目の10/10がヒットするので100行目というのを変数に格納したいのです。これを実現できる関数があればお教えください。Find,match,instrなんの関数を利用しても実現できればOKです。

2009/04/01 18:06:29
  • id:SALINGER
    回答補足です。
    あらかじめデータを挿入するテーブルを作成しておいてください。
    (回答ではTestTableという名前にしています。)
    テーブルの日付とIDのフィールドには主キーを設定しないでください。
    これは、締切にした直前の質問の仕様だと、日付とIDが同じデータが存在するためです。
  • id:SALINGER
    日付はおおむね日付順に並んでいるのかと思いまして、10/10が無かった場合でも10/11以下を挿入できるように
    For~Nextを使いました。回答ではiに一番最初の行数が入ります。

    関数で行いたい場合は次の方法になります。
    Range("A10:A" & lastRow).Find("10/10",LookAt:=xlWhole).Row
  • id:Mook
    日付情報に年はいらないのですか?
    長く使うものであれば、年をまたぐデータがあるとき、年の情報がないと
    期待するように処理できないと思いますが。

    また、データは必ず日付順に並んでいるのでしょうか。
  • id:akaired
    Mookさん
    年も追加しました。2009/01/01のようにしました。またデータは日付順に必ず並んでいます。何か他にソリューションがありましたらお教えくださいませ。
  • id:akaired
    Salingerさん
    何度もすいません。行数が知りたいのではなくて、行番号が知りたいです。例えばテキストボックスに日付をいれてボタンをクリックすると一番最初にでてきた日付の行番号を取得したいのです。100行目にでてきたら100行目という行番号を変数にセットしたいのです。
  • id:SALINGER
    コメントで行数と書いてますが、行番号の間違いです。実際は行番号になっています。
    Findの使い方についてはもう1つの質問にまとめておきました。
  • id:SALINGER
    Findで求める日付の行番号が取得できない場合に考えられる間違いは、

    1 A列の表示形式が文字列ではなく日付になっている。
    日付の場合内部ではシリアル値になっているので、"10/10"と表示されていても
    Range("A:A").Find(What:="10/10",LookAt:=xlWhole).Row
    では取得できません。
    その場合ははxlValueの指定が必要です。
    Range("A:A").Find(What:="10/10",LookIn:=xlValue, LookAt:=xlWholes).Row

    2 What:=に日付型を使っている。
    私の回答では時間を比較するために、日付型のmyDate2という変数を使っています。
    それをそのまま
    Range("A:A").Find(What:=myDate2,LookAt:=xlWhole).Row
    とするとエラーとなります。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません