このような事をしたいと思いました。
壁その1:コード先頭に文字が入っている場合のデータ型は何か?
その時の最大値はどのように求めるか?
色々な例を見ると、当たり前のように先頭に文字がついています。
混乱しています。
壁その2:型式コードのところで、同じ車名の場合新たな型式があった場合その中で
の最大値
を付ける。
壁その3:基本的に引数の考え方が混乱しています。
入力はフォームから車名、型式、所有者を入力
コードは表内を検索して自動的に割り付ける
一致するものがあるか検索
一致するものが無い(新規の場合)
フォームのテキストボックスと表の車名などそれぞれ比べ
一致しなければ、それぞれの最大値をつける
最後にソートする
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
001 ブックの新規作成とテストデータの入力
まず、
もらった、質問に対して、新規にテスト用のブックを作りたいと思います。
テストデータをメモ帳上でタブ区切りにして、貼り付けると、
行・列がキレイに貼り付くので、意外と楽でした。
動画 QAをhtml時に貼る
http://www.youtube.com/watch?v=hilfrxE8ztw
002 新規にフォームを作成します
次は、新規にユーザーフォームを作成して、
入力用のコントロールとして、
テキストボックスで車名、型式、所有者
を作成します。
作成後、オブジェクトに名前をつけます
車名 textCAR
型式 textKATA
所有者 textSNAME
登録実行用のボタンを作成します。
登録 B_ADD
なにもしないユーザーフォーム(笑)が作成できたら
そのuserForm1を起動するコードを書きます。
コードは1行で
Sub open_form()
UserForm1.Show 'フォームを開く
End Sub
↑たったこれだけです。
シートにボタンを1つ貼り付けます。
(表示・ツールバー・フォームの中からボタンを選び、貼り付けます)
貼り付けたボタンに、先ほど作ったマクロを割り当てます
※ボタンを押したら open_form()を実行させます。
動画 QA002 html時に貼る
http://www.youtube.com/watch?v=8FqrxOv5Of8
003 車名の処理 一致する名前を探す
次は、車名の処理を行います。
登録ボタンB_ADDが押されたら、〜の処理を書きます。
'一致する名前を探してみた。そんなテスト
Private Sub B_ADD_Click()
Dim yLINE As Integer '行カウンタ
Dim strCAR_CODE As String '車種コード
strCAR_CODE = "NG" 'NGで初期化
For yLINE = 11 To 9999
'A列が空白行なら
If Cells(yLINE, "A") = "" Then Exit For
'B列の車名をテスト表示
Debug.Print Cells(yLINE, "B")
'入力された車名が一致するかチェック
If Cells(yLINE, "B") = Me.TextCAR.Text Then
strCAR_CODE = Cells(yLINE, "A") '車種コードを代入
End If
Next yLINE
'検索OKかチェック
If strCAR_CODE <> "NG" Then 'NG以外、見つかった
MsgBox "車種コードは" & strCAR_CODE
Else
MsgBox "車種コードが見つかりません"
'新たに、連番を振る
End If
End Sub
ポイントは、
~~~~~~~~~~
'入力された車名が一致するかチェック
If Cells(yLINE, "B") = Me.TextCAR.Text Then
strCAR_CODE = Cells(yLINE, "A") '車種コードを代入
End If
↑まぁ、こんな感じで、
入力された車名 Me.TextCAR.Text
と
シートのデータ Cells(yLINE(行), "B"(列))
を比べて、一致したら
変数 strCAR_CODE に Cells(yLINE, "A") 車種コードを代入
一致しなければ、strCAR_CODEは初期値の"NG"のまま、そんな感じです。
動画003を貼る html時に
http://www.youtube.com/watch?v=vigtJX2bpGY
003-2 車名が見つからない時、車種コード+1する。
さてと、ここが問題の
>壁その1:コード先頭に文字が入っている場合のデータ型は何か?
> その時の最大値はどのように求めるか?
> 色々な例を見ると、当たり前のように先頭に文字がついています。
> 混乱しています。
>
>壁その2:型式コードのところで、同じ車名の場合新たな型式があった場合その中で
>の最大値を付ける。
ですね。
まずは、最大値を保存しときたいので、
文字列で比較ができるか、実験。
"AA0007"と"AA0008"を比べてみますか。
Sub aaa()
'"AA0007"と"AA0008"を比べてみますか。
Dim strA As String
Dim strB As String
strA = "AA0007"
strB = "AA0008"
If strA < strB Then MsgBox strB & "がB大きい"
If strA > strB Then MsgBox strA & "がA大きい"
End Sub
これが、可能なら、ループに入れて、
現在のMAX値を保存しながら、車名を探してみます。
次もポイントの、車名が見つからない時は、
MAX値+1なので、
"AA0007" を +1して、"AA0008"にする方法を考えます。
まぁ、いろいろあるけど、
これは、ダメだろうなぁ。
test = "AA0007" + 1
↑人間の頭って、ホント賢いよねぇ、
これで変数testが"AA0008"になるんだから。
でも、コンピュータはバカ正直なので、少し小細工してみます。
Sub BBB()
Dim strA As String
Dim strB As String
Dim strWORK As String '後ろから4文字取り出す
strA = "AA0007"
strB = Left(strA, 2) & Right("0000" & (CLng(Right(strA, 4) + 1)), 4)
MsgBox "strB=" & strB
End Sub
こんな感じで、テストが済んだので、
下記のように組み込んでみました。
Private Sub B_ADD_Click()
Dim yLINE As Integer '行カウンタ
Dim strCAR_CODE As String '車種コード
Dim strMAX_CAR_CODE As String '最大値
Dim strWORK As String '後ろから4文字取り出す
strMAX_CAR_CODE = "" '最大コードを空文字にする
strCAR_CODE = "NG" 'NGで初期化
For yLINE = 11 To 9999
'A列が空白行なら
If Cells(yLINE, "A") = "" Then Exit For
'B列の車名をテスト表示
Debug.Print Cells(yLINE, "B")
'MAX コードを比べる
If strMAX_CAR_CODE < Cells(yLINE, "A") Then '大きかったら
strMAX_CAR_CODE = Cells(yLINE, "A") '代入
End If
'入力された車名が一致するかチェック
If Cells(yLINE, "B") = Me.TextCAR.Text Then
strCAR_CODE = Cells(yLINE, "A") '車種コードを代入
End If
Next yLINE
'検索OKかチェック
If strCAR_CODE <> "NG" Then 'NG以外、見つかった
MsgBox "車種コードは" & strCAR_CODE
Else
'MAX+1を計算する
'新たに、連番を振る
strCAR_CODE = Left(strMAX_CAR_CODE, 2) _
& Right("0000" & (CLng(Right(strMAX_CAR_CODE, 4) + 1)), 4)
MsgBox "+1されたコードは" & strCAR_CODE
End If
End Sub
ポイントは、
'MAX+1を計算する
strCAR_CODE = Left(strMAX_CAR_CODE, 2) _
& Right("0000" & (CLng(Right(strMAX_CAR_CODE, 4) + 1)), 4)
↑少し長いけど、頭2+4桁のコードを+1する、そんな感じです。
試行錯誤の動画 003-2 を htmlに貼る
http://www.youtube.com/watch?v=QvebBU-HTK8
-
-
-
- -
-
-
少し進んだら、また、書き込みます。
少々(しばらく)お待ちを。
よろしくお願いします。