■問合せの内容
会社で毎日の営業の獲得成績をエクセルにフォームで入力出来る様にしたいのですかうまくできません。

フォームのテキストボックス1に日付
以下テキストボックスに獲得数字を入力し登録ボタンを押すとテキストボックスの日付をA列から探し一致した日にちの列の指定セルに入力していきたいです。

2007年 6月
A列 B列 C列
日付 リンゴ みかん
1日 3 5
2日 5 4
3日
と言った感じです。
入力するのは今月分ですのでフォームで選んだ日付が該当しない場合はエラーを出したいのですが。

宜しくお願い致します

質問者からの補足コメント

  • 回答ありがとうございます。
    説明不足で申し訳ありません。
    テキストボックスは2017/7/12と今日の日付が自動表示されるようになっており、スピンボタンで変更可能になっています。
    エクセルシートも日にちと曜日で12(水)と表示されていますが、データは2017/7/12です。
    教えていただいたvbaをいれるとエラーがでてしまいました。
    どこを変更すればいいのですか?

    またテキストボックスは日付がスピンボタンで変更できる様になっていて、エクセルの日付は土日、祝日をカラー変更される様にしてあるため、上の年、月から自動でカレンダーを出してあるため、データは2017/7/12です。


    知識不足で申し訳ありません。
    宜しくお願い致します。

      補足日時:2017/07/12 17:46

A 回答 (4件)

こんにちは!



横からお邪魔します。
VBAの場合、日付検索には注意が必要です。
表示形式によってコード変更が必要になる場合がほとんどだと思います。

質問文通りA列の日付はシリアル値で表示形式が d日 となっているとします。
該当データがある場合はその行のB列にテキストボックス2のデータを、C列にテキストボックス3のデータを入力するというコードです。

Private Sub CommandButton1_Click()
Dim c As Range
Set c = Range("A:A").Find(what:=Format(TextBox1, "d日"), LookIn:=xlValues, lookat:=xlWhole)
If Not c Is Nothing Then
c.Offset(, 1) = TextBox2.Value
c.Offset(, 2) = TextBox3.Value
TextBox1 = ""
TextBox2 = ""
TextBox3 = ""
TextBox1.SetFocus
Else
MsgBox "該当日付なし"
End If
End Sub

※ A列の表示形式によって
>Format(TextBox1, "d日")
の部分で調整してみてください。

※ 表示形式だけでは「年・月」の判別ができませんので
今年・今月以外のデータでも「該当日付」はある!と判断してしまいます。

以上のコトを考慮すればA列の日付は最低限 7/3 のような感じにしておけば
少なくとも「月」の判断だけは可能です。m(_ _)m
    • good
    • 0
この回答へのお礼

ありがとうございました。
思った通りに出来ました。

お礼日時:2017/07/14 16:44

No.2・3です。



投稿後エラー画面が出たので、ダブって投稿してしまいました。
No.2は無視してください。m(_ _)m
    • good
    • 0

こんにちは!



横からお邪魔します。
VBAで日付検索する場合、注意が必要です。
セルの表示形式によってコードの変更が必要になるコトがほとんどだと思います。

お示しのようにA列の日付はシリアル値で表示形式が d日 となっている前提です。
テキストボックス2のデータをB列、テキストボックス3のデータをC列に入力するとします。

Private Sub CommandButton1_Click()
Dim i As Long, c As Range
Set c = Range("A:A").Find(what:=Format(TextBox1, "d日"), LookIn:=xlValues, lookat:=xlWhole)
If Not c Is Nothing Then
c.Offset(, 1) = TextBox2.Value
c.Offset(, 2) = TextBox3.Value
TextBox1 = ""
TextBox2 = ""
TextBox3 = ""
TextBox1.SetFocus
Else
MsgBox "該当日付なし"
End If
End Sub

※ A列の表示形式によって
>Format(TextBox1, "d日")
の部分で調整してください。

例えば 表示形式が d日(aaa) の場合はそのまま
>Format(TextBox1, "d日(aaa)")
といった具合になると思います。

※ 表示だけでは「年・月」の判別ができませんので、
今年・今月以外でも該当があればヒットします。m(_ _)m
    • good
    • 0

一つのシートは一ヶ月分の入力を行う。

(質問文では 2007年6月分のシート)
フォームを開いている時は、すでにこのシートがアクティブになっている。(ActiveSheet がこのシートを参照できる)
フォームの TextBox1 には日付の数値のみを入力する。(1 とか 15 とか)
シートの A列にある日付は、見た目には「1日」「3日」だが、セルには「1」とか「3」が入力されていて、セルの書式設定で「日」を付け足している。
という勝手な想像で書いてみました。

ユーザーフォームの TextBox1 に日付を表す数値 (1 とか 31 とか)を入力、TextBox2 や TextBox3 に実績値を入力。
コマンドボタンを押すと以下のコードを実施。
以下、ユーザーフォームのコードです。

GetTargetRow という関数を作り、フォームで入力した日付値の行が対象シートの A列に存在するかどうかをチェックし、存在する場合はその行番号を返すようにしました。
存在しなければ日付としては無効な値である 0 を返します。

あとはその行番号の B列と C列に実績値を入力します。

Option Explicit
Private Sub CommandButton1_Click()
 Dim targetSheet As Worksheet
 Set targetSheet = ActiveSheet
 
 Dim targetRow As Long
 
 targetRow = GetTargetRow(TextBox1.Value, targetSheet)
 
 If targetRow = 0 Then
  MsgBox "対象の日付が見つかりません。"
 Else
  targetSheet.Cells(targetRow, 2).Value = TextBox2.Value
  targetSheet.Cells(targetRow, 3).Value = TextBox3.Value
 End If
 
End Sub

Private Function GetTargetRow(aValue As Long, aTargetSheet As Worksheet) As Long
 Dim exists As Boolean
 exists = False
 
 Dim searchRange As Range
 Set searchRange = aTargetSheet.Range(aTargetSheet.Cells(2, 1), aTargetSheet.Cells(aTargetSheet.Cells(2, 1).End(xlDown).Row, 1))
 
 Dim rng As Range
 For Each rng In searchRange
  If rng.Value = aValue Then
   exists = True
   Exit For
  End If
 Next
 
 If exists Then
  GetTargetRow = rng.Row
 Else
  GetTargetRow = 0
 End If
 
End Function
    • good
    • 2
この回答へのお礼

ありがとうございました。
会社でやってみたのですがエラーとなってしまいます。
説明不足ですみませんが捕捉説明をいれたので宜しくお願い致します。

お礼日時:2017/07/13 08:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報