三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

7/27 かきかけ

このような事をしたいと思いました。

壁その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

        • -

少し進んだら、また、書き込みます。
少々(しばらく)お待ちを。
よろしくお願いします。

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)