If x < 63000 Then
gr = 1
Else
If x >= 63000 And x < 73000 Then
gr = 2
Else
If x >= 73000 And x < 83000 Then
gr = 3
End if
非常に簡単なコードなのですが、これが数十、数百になると、コードが寿限無化してしまい、
煩わしいばかりでなく、ミスもおこるし、修正も一苦労です。
いままで、我慢して使っていましたが、これではダメです。
連想配列のキーに、以上・未満の条件式が使えれば良いのですが、可能なのでしょう?
できない場合は、寿限無寿限無コードを使用しないで済む方法があったら、教えてください。
最悪の場合、寿限無コードの変化する部分を配列にして、同一番号で呼び出すようにして、ミスを減らすしかないのですが。
ごめん、この質問はMsAccess掲示板にあっているのかしら?hatenaさん、教えて下さい。
連想配列などコードでごりごりデータベースをやっていた時代があって、画期的なMsAccessが登場したおかげでそんな事をやらなくていい時代になって、労働生産性が改善されたんじゃなかったっけー?
x >= 63000 And x < 73000に対応できる、accessのデータ型をご存じでしたら、ご教授ください。
最大値と最小値を登録して検索させるというのであれば、寿限無地獄です。
これの手がありました。
わずか、20行。
頭が悪いという事は、不幸です~~~~~。
Min = Split("0,63000,73000,83000,93000,101000,107000,114000,122000,130000,138000,146000,155000,165000,175000,185000,195000,210000,230000,250000,270000,290000,310000,330000,350000,370000,395000,425000,455000,485000,515000,545000,575000,605000,635000,665000,695000,730000,770000,810000,855000,905000,955000,1005000,1055000,1115000,1175000,1235000,1295000,1355000", ",")
mx = Split("63000,73000,83000,93000,101000,107000,114000,122000,130000,138000,146000,155000,165000,175000,185000,195000,210000,230000,250000,270000,290000,310000,330000,350000,370000,395000,425000,455000,485000,515000,545000,575000,605000,635000,665000,695000,730000,770000,810000,855.ooo,905000,955000,1005000,1055000,1115000,1175000,1235000,1295000,1355000,1355000", ",")
gr1 = Split("1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50", ",")
std1 = Split("58000,68000,78000,88000,98000,104000,110000,118000,126000,134000,142000,150000,160000,170000,180000,190000,200000,220000,240000,260000,280000,300000,320000,340000,360000,380000,410000,440000,470000,500000,530000,560000,590000,620000,650000,680000,710000,750000,790000,830000,880000,930000,980000,1030000,1090000,1150000,1210000,1270000,1330000,1390000", ",")
gr2 = Split("1,1,1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32", ",")
std2 = Split("88000,88000,88000,88000,98000,104000,110000,118000,126000,134000,142000,150000,160000,170000,180000,190000,200000,220000,240000,260000,280000,300000,320000,340000,360000,380000,410000,440000,470000,500000,530000,560000,590000,620000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000", ",")
For i = 1 To 49
If x >= Min(i) And mx(i) Then
gr = gr1(i)
std1 = std1(i)
gr2 = gr2(i)
std2 = std2(i)
Exit For
Else
gr = gr1(50)
std1 = std1(50)
gr2 = gr2(50)
std2 = std2(50)
End If
Next
連想配列のキーは完全一致しか無理です。完全一致なので高速に検索できるのです。
このコードなら、xが10000間隔でgrが1増えていくという規則性があるので、下記のようなコードで可能です。
間隔が不規則であるなら、下記のようなテーブルを作成してそれを参照すればいいでしょう。
x_lowには範囲の下限値を入力しておきます。
また、インデックスを設定しておくと高速に検索できます。
下記のコードでgrを取得できます。
このように修正したら、正常になりました。
ご指摘の通り、配列のままでは使えませんでした。
実際には、PDFの表を変換したデータを使います。
とりあえず、税額表等のデータは、寿限無コードを使わなくて済むようになったので、
無駄な労力を使わなくて済むようになりました。
Dim x As Long
Dim y As Long
Dim z As Long
Min = Split("0,63000,73000,83000,93000,101000,107000,114000,122000,130000,138000,146000,155000,165000,175000,185000,195000,210000,230000,250000,270000,290000,310000,330000,350000,370000,395000,425000,455000,485000,515000,545000,575000,605000,635000,665000,695000,730000,770000,810000,855000,905000,955000,1005000,1055000,1115000,1175000,1235000,1295000,1355000", ",")
mx = Split("63000,73000,83000,93000,101000,107000,114000,122000,130000,138000,146000,155000,165000,175000,185000,195000,210000,230000,250000,270000,290000,310000,330000,350000,370000,395000,425000,455000,485000,515000,545000,575000,605000,635000,665000,695000,730000,770000,810000,855.ooo,905000,955000,1005000,1055000,1115000,1175000,1235000,1295000,1355000,1355000", ",")
gr1 = Split("1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50", ",")
std1 = Split("58000,68000,78000,88000,98000,104000,110000,118000,126000,134000,142000,150000,160000,170000,180000,190000,200000,220000,240000,260000,280000,300000,320000,340000,360000,380000,410000,440000,470000,500000,530000,560000,590000,620000,650000,680000,710000,750000,790000,830000,880000,930000,980000,1030000,1090000,1150000,1210000,1270000,1330000,1390000", ",")
gr2 = Split("1,1,1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32", ",")
std2 = Split("88000,88000,88000,88000,98000,104000,110000,118000,126000,134000,142000,150000,160000,170000,180000,190000,200000,220000,240000,260000,280000,300000,320000,340000,360000,380000,410000,440000,470000,500000,530000,560000,590000,620000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000", ",")
x = 70000
For i = 0 To 48
gr = ""
y = Min(i)
z = mx(i)
If x >= Min(i) And x < mx(i) Then
gr = gr1(i)
std1 = std1(i)
gr2 = gr2(i)
std2 = std2(i)
Exit For
End If
Next
If gr = "" Then
gr = gr1(49)
std1 = std1(49)
gr2 = gr2(49)
std2 = std2(49)
End If
PDFの表なら、もっといい方法はありそうですが、
後だしで、どんどん情報がかわっていくいつものパターンなので、
まあいいや。
わずかな手抜きは止めて、2次配列に格納する事にしました。
ここはAccessに関する質疑応答、技術的な情報交換の場です。
それを踏まえて、他の閲覧者や後から検索で訪問した人にとって、意味のある情報になるように、下記のような要件に対してAccessでどのように解決するかという観点で、回答をおいておきます。
PDFから表データを取り込む
WordでPDFファイルを開きます。
欲しい表部分をコピーしてエクセルのシートに貼り付けます。
これをAccessにインポートします。
これで、pdfの表データをAccessのテーブルとして取り込めます。
これは1回のみの作業なのでVBAにするまでもないでしょう。
VBAで自動化したい場合は、下記等を参考に。
【Excel/VBA】PDFやWordから表データだけを抽出するマクロ | hamalabo
キー値をもとに、下限値と上限値の範囲に合致するデータをとりだす。
取り込んだテーブル名はTbl1とする。
[条件値]と[下限値]フィールドにインデックスを設定する。