|
▼M さん:
こんばんは。
> 只担当者がある商品を売った場合CN番号がないため
> (証明書番号)空欄になります。
> 次に担当者がCNを切ったときは1と表示され連番になりません。
> 仕方のないことなのでしょうか。
> オートフイルタを使った場合は連番で表示されます。
というのは
【57598】 に書き込んだコードのことだったでしょうか?
これは、実は オートフィルタ方式ではありません。
必要な列の値を全行メモリ(配列)にいれ、配列内で
処理しています。
このコードと他のコードの CN番号 を求める方法の違いは、
他のコードが 「会社名」と「担当者名」の一致する行の
▲「最後の行」を求めているのに対して、
【57598】では、
> cboKaishaのChangeで cboTantouの担当者リストをつくるとき、
> いっしょに CN請求書番号 もcboTantouのリストに表示しておけば
>
(コードの主要部分)
> Set dic = CreateObject("Scripting.Dictionary")
> For i = 0 To UBound(vTantou) - 1
> ss = vTantou(i)
> If dic.Exists(ss) Then
> numCN = dic(ss)
> If numCN < vCN(i) Then dic(ss) = vCN(i)
> Else
> dic(ss) = vCN(i)
> End If
> Next
> ユーザーが担当者リストのどれかを選択すると同時に、
> テキストボックス txtCN に 最終番号+1が表示されます
と説明にあるように、
「会社名」と「担当者名」の一致する行の CN番号の★[最大値]を
dictionaryにあらかじめ格納しているからです。
ですから、フィルタ方式でも、Find方式でも、
「会社名」と「担当者名」の一致する行の ▲「最後の行」でなく、
該当行のうち CN番号の★[最大値]を求めるようにすれば、
どの方式でも、その点に関しては不具合は出なくなると思います。
▼最後に書き込んだ
> Sub もしFindを使うなら_その2()
をこの方式に改良すると、次のような感じです。
Sub もしFindを使うなら_その3() '最終CN値でなく、最大CN番号を求める
Dim c As Range, RngSearch As Range
Dim 会社名 As String
Dim 担当者名 As String
Dim 検索値 As String
Dim numCN, hCN
Dim ok As Boolean
Dim firstAddress As String
If cboKaisha.ListIndex > -1 Then
会社名 = cboKaisha.Text
If cboTantou.ListIndex > -1 Then
担当者名 = cboTantou.Text
検索値 = 会社名 & "|" & 担当者名
ok = True
End If
End If
If Not ok Then Exit Sub
With Worksheets("AAA")
Set RngSearch = .Range("Q2", Cells(.Rows.Count).End(xlUp))
'作業列を一巡検索 検索値 = 会社名 & "|" & 担当者名
Set c = rngserch.Find(検索値, , LookIn:=xlValues, LookAt:=xlWhole)
If Not c Is Nothing Then
firstAddress = c.Address
Do
hCN = .Cells(c.Row, "H").Value
If IsNumeric(hCN) Then
If numCN < hCN Then numCN = hCN '最大CN番号さがし
End If
Set c = RngSearch.FindNext(c)
Loop Until c.Address = firstAddress
txtCN.Text = numCN + 1
Else
MsgBox "指定会社の指定担当者が見つかりませんでした"
txtCN.Text = ""
End If
End With
End Sub
|
|