Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


8892 / 13646 ツリー ←次へ | 前へ→

【30484】最終行取得のところで りんご3 05/10/28(金) 16:10 質問[未読]
【30486】Re:最終行取得のところで Kein 05/10/28(金) 16:20 回答[未読]
【30488】Re:最終行取得のところで りんご3 05/10/28(金) 16:36 質問[未読]
【30493】Re:最終行取得のところで Kein 05/10/28(金) 17:23 回答[未読]
【30495】Re:最終行取得のところで りんご3 05/10/28(金) 17:40 お礼[未読]
【30494】Re:最終行取得のところで hine 05/10/28(金) 17:38 発言[未読]

【30484】最終行取得のところで
質問  りんご3  - 05/10/28(金) 16:10 -

引用なし
パスワード
   度々お助けいただきましてありがとうございます。
またまたお知恵を拝借させていただきたいのですが、

表にデータを入力してボタンをおすとデータベースに登録する。というものを作っていまして、その表にはデータ入力できる欄が15行くらいありまして、
一行目から順番に一行もとばさずいれた時はいいのですが
一行とばすとスペースの前までのデータだけ登録でき、
スペース後のデータが登録されません。
スペースがあってもデータを取得できる方法か、スペースがあいて入力が
あった時はエラーになって順番に入力しないといけないようなものにしたいのですが・・・・
よろしくお願いいたします。
ちなみに下記プログラムのどこにどう書いたらいいのか教えてください。
Sub btn登録_Click()

 Dim oraDS As OracleInProcServer.OraDynaset 'OraDynasetオブジェクト
 Dim selCmd As String            '選択用のSQL文
 Dim delCmd As String            '削除用のSQL文
 Dim n As Integer              '注文明細の個数
 Dim i As Integer              'カウンタ
 
 'データベースの接続を確認する
 If oraDB Is Nothing Then
  MsgBox "データベースに接続していないため、データを登録できません", vbOKOnly, "注文書作成"
  Exit Sub
 End If
 
 '入力したデータ数(c13:C27)を調べる
 n = Application.WorksheetFunction.CountA(Range("C13:C27"))
 If n = 0 Then
  MsgBox "明細を入力していないため登録できません", vbOKOnly, "注文書作成"
  Exit Sub
 End If
 
 'トランザクション開始
 oraSS.BeginTrans
 
 '既存の注文書のとき
 If Range("I1").Value = "既存" Then
  '[T_SUB]テーブルから削除
  delCmd = "DELETE FROM T_SUB " & "WHERE ORDER_NO = '" & Range("D8") & "'"
  oraDB.ExecuteSQL delCmd
  
  '[T_MAIN]テーブルから削除
  delCmd = "DELETE FROM T_MAIN " & "WHERE ORDER_NO = '" & Range("D8") & "'"
  oraDB.ExecuteSQL delCmd
  End If
 
 '[T_MAIN]テーブルにレコードを追加
 selCmd = "SELECT * FROM T_MAIN"
 Set oraDS = oraDB.CreateDynaset(selCmd, ORADYN_DEFAULT)
 
 oraDS.AddNew
 oraDS.Fields("ORDER_NO").Value = Range("D8").Value   '注文番号
 oraDS.Fields("ORDER_DAY").Value = Range("F8").Value  '注文日
 oraDS.Fields("SNO").Value = Range("A1").Value     '連番
 oraDS.Fields("KO_NO").Value = Range("D9").Value    '顧客番号
 oraDS.Fields("TAN_NAME").Value = Range("I4").Value   '担当者
 oraDS.Fields("TAX").Value = Range("I5").Value     '消費税率
 oraDS.Fields("PAYMENT").Value = Range("I8").Value   '支払い方法
 oraDS.Fields("DELIVER").Value = Range("I9").Value   'お届け方法
 oraDS.Fields("BIKO").Value = Range("B33").Value    '備考
 oraDS.Update
 Set oraDS = Nothing
 
 '[T_SUB]テーブルにレコードを追加
 selCmd = "SELECT * FROM T_SUB"
 Set oraDS = oraDB.CreateDynaset(selCmd, ORADYN_DEFAULT)
 
 For i = 0 To n - 1
  oraDS.AddNew
  oraDS.Fields("ORDER_NO").Value = Range("D8").Value     '注文番号
  oraDS.Fields("SHO_NO").Value = Range("C" & 13 + i).Value  '品番
  oraDS.Fields("NUM").Value = Range("H" & 13 + i).Value   '数量
  oraDS.Update
  Next i
 
  Set oraDS = Nothing
 
  'コミット
  oraSS.CommitTrans
 
  '後処理
  MsgBox "登録しました", vbOKOnly, "注文書作成"

【30486】Re:最終行取得のところで
回答  Kein  - 05/10/28(金) 16:20 -

引用なし
パスワード
   要するに、データの入力チェックをしたいのですね ?
"一件も入力されていない" 場合なら、あなたのコードで良いわけですが、
"一件でも入力漏れがあれば" という処理にするなら

n = Application.WorksheetFunction.CountA(Range("C13:C27"))
If n < 15 Then
  MsgBox "明細を入力していない個所があります", vbOKOnly, "注文書作成"
  Exit Sub
End If

とか

n = Application.WorksheetFunction.CountBlank(Range("C13:C27"))
If n > 0 Then
  MsgBox "明細を入力していない個所があります", vbOKOnly, "注文書作成"
  Exit Sub
End If

などとすれば良いでしょう。

【30488】Re:最終行取得のところで
質問  りんご3  - 05/10/28(金) 16:36 -

引用なし
パスワード
   ▼Kein さん:
>要するに、データの入力チェックをしたいのですね ?
>"一件も入力されていない" 場合なら、あなたのコードで良いわけですが、
>"一件でも入力漏れがあれば" という処理にするなら
>
>n = Application.WorksheetFunction.CountA(Range("C13:C27"))
>If n < 15 Then
>  MsgBox "明細を入力していない個所があります", vbOKOnly, "注文書作成"
>  Exit Sub
>End If
>
>とか
>
>n = Application.WorksheetFunction.CountBlank(Range("C13:C27"))
>If n > 0 Then
>  MsgBox "明細を入力していない個所があります", vbOKOnly, "注文書作成"
>  Exit Sub
>End If
>
>などとすれば良いでしょう。

早速の回答ありがとうございます。
早速ためしてみたのですが、毎回、15行ばかりになるわけではなく、
一行の時もあれば10行の時もあるので
上のプログラムだと15行全部に値がないと次にいかないかたちになってしまうのですが・・・・

【30493】Re:最終行取得のところで
回答  Kein  - 05/10/28(金) 17:23 -

引用なし
パスワード
   ならば

n = Application.WorksheetFunction.CountA(Range("C13:C27"))
If n = 0 Then
  MsgBox "明細が全く入力されていません", vbOKOnly, "注文書作成"
  Exit Sub
ElseIf n > 0 And n < 15 0 Then
  If Range("C13:C27").SpecialCells(2).Areas.Count > 1 Then
   MsgBox "明細を入力していない個所があります", vbOKOnly, "注文書作成"
   Exit Sub
  End If
End If

で、どうでしょーか ?
 

【30494】Re:最終行取得のところで
発言  hine  - 05/10/28(金) 17:38 -

引用なし
パスワード
   りんご3 さん
Kein さん
こんにちは

kein さん
後ろから失礼します。お許し下さい。

範囲が狭いので総当りではどうでしょうか?
勘違いならすいません。

Sub Test()

Dim myR As Range
Dim myH As Boolean
Dim myS As Boolean
Dim i As Variant

myH = True
myS = True

With Worksheets("Sheet1")
  Set myR = .Range("C13:C27")
  For Each i In myR
    If i.Value <> "" And i.Offset(0, 5).Value = "" Then
      myH = False
    End If
    If i.Value = "" And i.Offset(0, 5).Value <> "" Then
      myS = False
    End If
  Next
  
  If myS = False Then
    MsgBox "C列未入力"
  End If
  If myH = False Then
    MsgBox "H列未入力"
  End If
  If myS = True And myH = True Then
  MsgBox "入力OK"
  End If
End With

Set myR = Nothing
End Sub

keinさん失礼しました。

【30495】Re:最終行取得のところで
お礼  りんご3  - 05/10/28(金) 17:40 -

引用なし
パスワード
   ▼Kein さん:
>ならば
>
>n = Application.WorksheetFunction.CountA(Range("C13:C27"))
>If n = 0 Then
>  MsgBox "明細が全く入力されていません", vbOKOnly, "注文書作成"
>  Exit Sub
>ElseIf n > 0 And n < 15 0 Then
>  If Range("C13:C27").SpecialCells(2).Areas.Count > 1 Then
>   MsgBox "明細を入力していない個所があります", vbOKOnly, "注文書作成"
>   Exit Sub
>  End If
>End If
>
>で、どうでしょーか ?
> 
ありがとうございました。
まさに考えていたとおりのプログラムになりました。

8892 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free