Excel VBA質問箱 IV

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

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


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

【48706】変則進数の処理について よね 07/5/2(水) 18:04 質問[未読]
【48710】Re:変則進数の処理について ichinose 07/5/2(水) 20:42 発言[未読]
【48711】Re:変則進数の処理について 追伸 ichinose 07/5/2(水) 20:57 発言[未読]
【48713】Re:変則進数の処理について 追伸 ichinose 07/5/2(水) 22:16 発言[未読]
【48785】Re:変則進数の処理について 追伸 よね 07/5/8(火) 17:00 お礼[未読]

【48706】変則進数の処理について
質問  よね  - 07/5/2(水) 18:04 -

引用なし
パスワード
   いつも大変参考にさせていただいております。

実はPDF文書で送られてくるシリアル番号をExcelに転記しようと思いまして。



073X18050 - 073X18099

これを
073X18050
073X18051
073X18052
073X18053
・・・


これだけだったら簡単だったんですが・・・

実は変則30進法でして・・・
0,1,2,3,4,5,6,7,8,9,a,c,d,e,f,g,h,j,k,m,n,p,r,t,u,v,w,x,y


これで一気に難易度が上がってしまって・・・


列に書いて、
offset関数を使ってやろう と思ったんですが
桁の繰り上がりでつまづきました・・・

何か良い手はありませんか?よろしくお願いします。

【48710】Re:変則進数の処理について
発言  ichinose  - 07/5/2(水) 20:42 -

引用なし
パスワード
   ▼よね さん:
6回読んでやっと何となくわかりました。

>いつも大変参考にさせていただいております。
>
>実はPDF文書で送られてくるシリアル番号をExcelに転記しようと思いまして。
>
>
>例
>073X18050 - 073X18099
これ、073X18050から、073X18099までのその変則30進数を
羅列するということですか?

>これを
>073X18050
>073X18051
>073X18052
>073X18053
>・・・
>
>
>
>実は変則30進法でして・・・
>0,1,2,3,4,5,6,7,8,9,a,c,d,e,f,g,h,j,k,m,n,p,r,t,u,v,w,x,y

後は、この変則30進数の説明をしてください。

【48711】Re:変則進数の処理について 追伸
発言  ichinose  - 07/5/2(水) 20:57 -

引用なし
パスワード
   わからないのは、
>>実は変則30進法でして・・・
>>0,1,2,3,4,5,6,7,8,9,a,c,d,e,f,g,h,j,k,m,n,p,r,t,u,v,w,x,y

これがどうして30進数なのですか?
29しか文字はないですが・・・。
そこが変則の所以ですか?
>後は、この変則30進数の説明をしてください。

【48713】Re:変則進数の処理について 追伸
発言  ichinose  - 07/5/2(水) 22:16 -

引用なし
パスワード
   >わからないのは、
>>>実は変則30進法でして・・・
>>>0,1,2,3,4,5,6,7,8,9,a,c,d,e,f,g,h,j,k,m,n,p,r,t,u,v,w,x,y
このとおりだとした場合の簡単なサンプルです。


新規ブックの標準モジュールに
'==================================================================
Option Explicit
  Private arefarray As Variant
  Private a_edvalue As String
  Private a_idx() As Long
'===================================================================
Sub abnor30_init(ByVal stvalue As String, ByVal edvalue As String)
  Dim g0 As Long
  Erase a_idx()
  arefarray = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", _
       "a", "c", "d", "e", "f", "g", "h", "j", _
       "k", "m", "n", "p", "r", "t", "u", "v", "w", "x", "y")
  a_edvalue = Trim(edvalue)
  ReDim a_idx(1 To Len(Trim(edvalue)))
  For g0 = 1 To Len(Trim(edvalue))
    a_idx(g0) = -1
    Next
  For g0 = 1 To Len(Trim(stvalue))
    a_idx(UBound(a_idx) - g0 + 1) = Application.Match(LCase(Mid(stvalue, Len(stvalue) - g0 + 1, 1)), _
                     arefarray, 0) - 1
    Next
End Sub
'======================================================================
Function abnor30_get(myvalue As String) As Long
  Dim g0 As Long
  abnor30_get = 0
  For g0 = UBound(a_idx()) To LBound(a_idx()) Step -1
    If a_idx(g0) + 1 <= UBound(arefarray) Then
     a_idx(g0) = a_idx(g0) + 1
     If a_idx(g0) = 0 Then a_idx(g0) = 1
     Exit For
    Else
     a_idx(g0) = 0
     End If
    Next
  myvalue = ""
  On Error Resume Next
  For g0 = LBound(a_idx()) To UBound(a_idx())
    Err.Clear
    myvalue = myvalue & arefarray(a_idx(g0))
    If Err.Number <> 0 Then myvalue = ""
    Next
  If myvalue = LCase(a_edvalue) Then abnor30_get = 1
  On Error GoTo 0
End Function
'=======================================================================
Sub abnor30_term()
  Erase arefarray
  a_edvalue = ""
  Erase a_idx()
End Sub


別の標準モジュールに
'=================================================================
Sub test()
  Dim g0 As Long
  Dim myvalue As String
  Call abnor30_init("073X18050", "073X18099")
  Cells(g0 + 1, 1).Value = "073X18050"
  g0 = g0 + 1
  Do While abnor30_get(myvalue) = 0
    Cells(g0 + 1, 1).Value = UCase(myvalue)
    g0 = g0 + 1
    Loop
  Cells(g0 + 1, 1).Value = UCase(myvalue)
  Call abnor30_term
End Sub


として、testを実行してみてください

アクティブシートのA列に

073X18050
073X18051
073X18052
073X18053
073X18054
073X18055
073X18056
073X18057



073X18099

と羅列表示します。
因みに上記の例だとセルA1からA126までデータが表示されました。

このようなことですか?


>
>これがどうして30進数なのですか?
>29しか文字はないですが・・・。
>そこが変則の所以ですか?
>>後は、この変則30進数の説明をしてください。

【48785】Re:変則進数の処理について 追伸
お礼  よね  - 07/5/8(火) 17:00 -

引用なし
パスワード
   ichinose さん

返信遅れまして、また拙い日本語で説明が至らず申し訳ございません。

すごいプログラムですね・・・理解するのに時間がかかりそうですが
一つ一つ自分のものにしていきたいと思います。
ちなみに
rightつかって下1桁を出して、
select caseつかって
1だったら2
2だったら3
3だったら4・・・・
という感じの文を書いたら
膨大な量になってしまいました・・・
勉強してきます。ありがとうございました。


>>わからないのは、
>>>>実は変則30進法でして・・・
>>>>0,1,2,3,4,5,6,7,8,9,a,c,d,e,f,g,h,j,k,m,n,p,r,t,u,v,w,x,y
>このとおりだとした場合の簡単なサンプルです。
>
>
>新規ブックの標準モジュールに
>'==================================================================
>Option Explicit
>  Private arefarray As Variant
>  Private a_edvalue As String
>  Private a_idx() As Long
>'===================================================================
>Sub abnor30_init(ByVal stvalue As String, ByVal edvalue As String)
>  Dim g0 As Long
>  Erase a_idx()
>  arefarray = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", _
>       "a", "c", "d", "e", "f", "g", "h", "j", _
>       "k", "m", "n", "p", "r", "t", "u", "v", "w", "x", "y")
>  a_edvalue = Trim(edvalue)
>  ReDim a_idx(1 To Len(Trim(edvalue)))
>  For g0 = 1 To Len(Trim(edvalue))
>    a_idx(g0) = -1
>    Next
>  For g0 = 1 To Len(Trim(stvalue))
>    a_idx(UBound(a_idx) - g0 + 1) = Application.Match(LCase(Mid(stvalue, Len(stvalue) - g0 + 1, 1)), _
>                     arefarray, 0) - 1
>    Next
>End Sub
>'======================================================================
>Function abnor30_get(myvalue As String) As Long
>  Dim g0 As Long
>  abnor30_get = 0
>  For g0 = UBound(a_idx()) To LBound(a_idx()) Step -1
>    If a_idx(g0) + 1 <= UBound(arefarray) Then
>     a_idx(g0) = a_idx(g0) + 1
>     If a_idx(g0) = 0 Then a_idx(g0) = 1
>     Exit For
>    Else
>     a_idx(g0) = 0
>     End If
>    Next
>  myvalue = ""
>  On Error Resume Next
>  For g0 = LBound(a_idx()) To UBound(a_idx())
>    Err.Clear
>    myvalue = myvalue & arefarray(a_idx(g0))
>    If Err.Number <> 0 Then myvalue = ""
>    Next
>  If myvalue = LCase(a_edvalue) Then abnor30_get = 1
>  On Error GoTo 0
>End Function
>'=======================================================================
>Sub abnor30_term()
>  Erase arefarray
>  a_edvalue = ""
>  Erase a_idx()
>End Sub
>
>
>別の標準モジュールに
>'=================================================================
>Sub test()
>  Dim g0 As Long
>  Dim myvalue As String
>  Call abnor30_init("073X18050", "073X18099")
>  Cells(g0 + 1, 1).Value = "073X18050"
>  g0 = g0 + 1
>  Do While abnor30_get(myvalue) = 0
>    Cells(g0 + 1, 1).Value = UCase(myvalue)
>    g0 = g0 + 1
>    Loop
>  Cells(g0 + 1, 1).Value = UCase(myvalue)
>  Call abnor30_term
>End Sub
>
>
>として、testを実行してみてください
>
>アクティブシートのA列に
>
>073X18050
>073X18051
>073X18052
>073X18053
>073X18054
>073X18055
>073X18056
>073X18057
>・
>・
>・
>073X18099
>
>と羅列表示します。
>因みに上記の例だとセルA1からA126までデータが表示されました。
>
>このようなことですか?
>
>
>>
>>これがどうして30進数なのですか?
>>29しか文字はないですが・・・。
>>そこが変則の所以ですか?
>>>後は、この変則30進数の説明をしてください。

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