Excel VBA質問箱 IV

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

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


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

【30205】このコードは高速化可能か ken 05/10/21(金) 16:34 質問[未読]
【30207】Re:このコードは高速化可能か 角田 05/10/21(金) 17:42 回答[未読]
【30208】Re:このコードは高速化可能か ken 05/10/21(金) 18:23 質問[未読]
【30209】Re:このコードは高速化可能か 角田 05/10/21(金) 18:50 回答[未読]
【30210】Re:このコードは高速化可能か ken 05/10/21(金) 19:02 お礼[未読]
【30254】Byte型について わさび 05/10/24(月) 8:34 質問[未読]
【30280】Re:Byte型について 小僧 05/10/24(月) 13:15 発言[未読]
【30293】Re:Byte型について でれすけ 05/10/24(月) 16:48 発言[未読]
【30299】Re:Byte型について わさび 05/10/24(月) 18:44 質問[未読]
【30301】Re:Byte型について 参加 ichinose 05/10/24(月) 19:49 発言[未読]
【30355】Re:Byte型について 参加 わさび 05/10/25(火) 18:24 お礼[未読]
【30359】Re:Byte型について 参加 ichinose 05/10/25(火) 19:23 発言[未読]
【30368】Re:Byte型について 参加 わさび 05/10/26(水) 8:30 お礼[未読]
【30314】Re:Byte型について でれすけ 05/10/25(火) 9:45 発言[未読]
【30358】Re:Byte型について わさび 05/10/25(火) 19:04 お礼[未読]

【30205】このコードは高速化可能か
質問  ken  - 05/10/21(金) 16:34 -

引用なし
パスワード
   大変読みにくいコードで申し訳ありません。VBAの本を片手に書き上げたコードなのですが、計算時間が遅くお手上げ状態です。下記のコードで、速くするよい方法はないでしょうか?コードは選択&データ読込を、Excelに貼り付けた数値を読込んで計算し、最大値を求める計算をします。

Dt = Range("a2").Value ^ -1
For s = 1 To 50   '周期選択'
t(s) = Cells(s + 1, 8).Value
 For g = 1 To 5  '減衰選択'
  h = Cells(g, 6).Value
  w = 2 * Application.WorksheetFunction.Pi() / t(s)
  w2 = w ^ 2
  hw = h * w
  wd = w * Sqr(1 - h ^ 2)
  wdt = wd * Dt
  e = Exp(-hw * Dt)
  cwdt = Cos(wdt)
  swdt = Sin(wdt)
  a11 = e * (cwdt + hw * swdt / wd)
  a12 = e * swdt / wd
  a21 = -e * w2 * swdt / wd
  a22 = e * (cwdt - hw * swdt / wd)
  ss = -hw * swdt - wd * cwdt
  cc = -hw * cwdt + wd * swdt
  s1 = (e * ss + wd) / w2
  c1 = (e * cc + hw) / w2
  s2 = (e * Dt * ss + hw * s1 + wd * c1) / w2
  c2 = (e * Dt * cc + hw * c1 - wd * s1) / w2
  s3 = Dt * s1 - s2
  c3 = Dt * c1 - c2
  b11 = -s2 / wdt
  b12 = -s3 / wdt
  b21 = (hw * s2 - wd * c2) / wdt
  b22 = (hw * s3 - wd * c3) / wdt
    
   For a = 1 To 3   '成分選択'
   For n = 0 To 50000   'データ読込'
    If n = 0 Then      '初期条件'  
    x(n, g, a) = 0
    y(n, g, a) = -Cells(5, a).Value * Dt
    xy(n, g, a) = 2 * Cells(5, a).Value * w * h * Dt
    ElseIf n > 0 Then
    x(n, g, a) = (a11 * x(n - 1, g, a) + a12 * y(n - 1, g, a) + b11 * Cells(n + 4,a).Value + b12 * Cells(n + 5, a).Value)
    y(n, g, a) = (a21 * x(n - 1, g, a) + a22 * y(n - 1, g, a) + b21 * Cells(n + 4, a).Value + b22 * Cells(n + 5, a).Value)
    xy(n, g, a) = -2 * h * w * y(n, g, a) - w2 * x(n, g, a)
    End If
   Next n
      
   xmax(s, g, a) = Abs(x(0, g, a))
   ymax(s, g, a) = Abs(y(0, g, a))
   xymax(s, g, a) = Abs(xy(0, g, a))
   For n = 0 To 50000   '最大値を求める'
    If Abs(x(n, g, a)) >= xmax(s, g, a) Then xmax(s, g, a) = Abs(x(n, g, a))
    If Abs(y(n, g, a)) >= ymax(s, g, a) Then ymax(s, g, a) = Abs(y(n, g, a))
    If Abs(xy(n, g, a)) >= xymax(s, g, a) Then xymax(s, g, a) = Abs(xy(n, g, a))
   Next n
  Next a
  Next g
 Next s
以上です。

【30207】Re:このコードは高速化可能か
回答  角田 WEB  - 05/10/21(金) 17:42 -

引用なし
パスワード
   こんにちは。
>計算時間が遅くお手上げ状態です。
50000*3*50=750万回ですか?

先ず、ここには記載されてませんが全ての変数は
Dim文で型宣言(変数宣言)してありますか?
していなければ全てVariant型になりますから、
LongなりDoubleなり型宣言してあるものに比べれば
遅いでしょう。

>  y(n, g, a) = -Cells(5, a).Value * Dt
>  xy(n, g, a) = 2 * Cells(5, a).Value * w * h * Dt
> ElseIf n > 0 Then
>  x(n, g, a) = 〜 + b11 * Cells(n + 4,a).Value + b12 * Cells(n + 5, a).Value)
>  y(n, g, a) = 〜 + b21 * Cells(n + 4, a).Value + b22 * Cells(n + 5, a).Value)
↑で使っているセル範囲(A1:C50005)を処理に入る前に
一括して配列に取り込んでおけばセルへのアクセスが減って
早くなるでしょう。
Dim vntCell As Variant
vntCell = Worksheets("Sheet1").Range("A1:C50005").Value

【30208】Re:このコードは高速化可能か
質問  ken  - 05/10/21(金) 18:23 -

引用なし
パスワード
   ▼角田 さん:
>こんにちは。
>>計算時間が遅くお手上げ状態です。
>50000*3*50=750万回ですか?
>
>先ず、ここには記載されてませんが全ての変数は
>Dim文で型宣言(変数宣言)してありますか?
>していなければ全てVariant型になりますから、
>LongなりDoubleなり型宣言してあるものに比べれば
>遅いでしょう。
>
>>  y(n, g, a) = -Cells(5, a).Value * Dt
>>  xy(n, g, a) = 2 * Cells(5, a).Value * w * h * Dt
>> ElseIf n > 0 Then
>>  x(n, g, a) = 〜 + b11 * Cells(n + 4,a).Value + b12 * Cells(n + 5, a).Value)
>>  y(n, g, a) = 〜 + b21 * Cells(n + 4, a).Value + b22 * Cells(n + 5, a).Value)
>↑で使っているセル範囲(A1:C50005)を処理に入る前に
>一括して配列に取り込んでおけばセルへのアクセスが減って
>早くなるでしょう。
>Dim vntCell As Variant
>vntCell = Worksheets("Sheet1").Range("A1:C50005").Value

返信ありがとうございます。
750万回にさらに5を掛けるので2250万回で、変数は以下のものを使用しております。
Dim t(50) As Single, w As Single, w2 As Single, hw As Single, wd As   Single, wdt As Single, n As Integer
  Dim h As Single, e As Single, cwdt As Single, swdt As Single, a11 As Single, a12 As Single, a21 As Single, a22 As Single
  Dim ss As Single, cc As Single, s1 As Single, c1 As Single, s2 As Single, c2 As Single, s3 As Single, c3 As Single
  Dim Dt As Single, b11 As Single, b12 As Single, b21 As Single, b22 As Single, x(13000, 5, 3) As Variant, y(13000, 5, 3) As Variant, xy(13000, 5, 3) As Variant
  Dim xmax(50, 5, 3) As Variant, ymax(50, 5, 3) As Variant, xymax(50, 5, 3) As Variant
  Dim s As Byte, g As Byte, a As Byte

セル範囲を取り込む方法で、個々のセルの値を選択して計算することは出来るんですか?5万回のところはExcelでこのようになっているのですが
NS1    EW1    UD1
200        
IBRH14 2004/11/29 03:32:00        
Gal    Gal    Gal
0    0    0.02
0.01    0    0.03
0.01    0    0.03
0.02    0    0.03
0.02    0    0.03
0.02    0    0.02

【30209】Re:このコードは高速化可能か
回答  角田 WEB  - 05/10/21(金) 18:50 -

引用なし
パスワード
   >Dim s As Byte, g As Byte, a As Byte
Byteは数値用としては普通は使いません。Integer型が良いです。

>x(13000, 5, 3) As Variant, y(13000, 5, 3) As Variant,
>xy(13000, 5, 3) As Variant
>xmax(50, 5, 3) As Variant, ymax(50, 5, 3) As Variant,
>xymax(50, 5, 3) As Variant
↑の中には数値以外のデータが入る事があるのですか?
数値だけならSingleとかDoubleとかの数値型で宣言した方が良いです。

>セル範囲を取り込む方法で、個々のセルの値を選択して計算することは出来るんですか?
>>Dim vntCell As Variant
>>vntCell = Worksheets("Sheet1").Range("A1:C50005").Value
これで取り込んでおけば
> y(n, g, a) = 〜 + b21 * Cells(n + 4, a).Value + b22 * Cells(n + 5, a).Value)
 ↓
y(n, g, a) = 〜 + b21 * vntCell(n + 4, a).Value + b22 * vntCell(n + 5, a).Value)

【30210】Re:このコードは高速化可能か
お礼  ken  - 05/10/21(金) 19:02 -

引用なし
パスワード
   ▼角田 さん:
>>Dim s As Byte, g As Byte, a As Byte
>Byteは数値用としては普通は使いません。Integer型が良いです。
>
>>x(13000, 5, 3) As Variant, y(13000, 5, 3) As Variant,
>>xy(13000, 5, 3) As Variant
>>xmax(50, 5, 3) As Variant, ymax(50, 5, 3) As Variant,
>>xymax(50, 5, 3) As Variant
>↑の中には数値以外のデータが入る事があるのですか?
>数値だけならSingleとかDoubleとかの数値型で宣言した方が良いです。
>
>>セル範囲を取り込む方法で、個々のセルの値を選択して計算することは出来るんですか?
>>>Dim vntCell As Variant
>>>vntCell = Worksheets("Sheet1").Range("A1:C50005").Value
>これで取り込んでおけば
>> y(n, g, a) = 〜 + b21 * Cells(n + 4, a).Value + b22 * Cells(n + 5, a).Value)
> ↓
>y(n, g, a) = 〜 + b21 * vntCell(n + 4, a).Value + b22 * vntCell(n + 5, a).Value)

これらは、
x(13000, 5, 3) As Variant, y(13000, 5, 3) As Variant,
>>xy(13000, 5, 3) As Variant
>>xmax(50, 5, 3) As Variant, ymax(50, 5, 3) As Variant,
>>xymax(50, 5, 3) As Variant
数値だけです。
いろいろとお世話になりました。角田さんの方法で作り直してみます。

【30254】Byte型について
質問  わさび  - 05/10/24(月) 8:34 -

引用なし
パスワード
   横からすみません。

>Byteは数値用としては普通は使いません。Integer型が良いです。
とのことですが、
Byte型はどのようなときに使うのがよいのでしょうか。
型宣言でいつも悩んでおります。

【30280】Re:Byte型について
発言  小僧  - 05/10/24(月) 13:15 -

引用なし
パスワード
   ▼わさび さん:
こんにちは。

>Byte型はどのようなときに使うのがよいのでしょうか。

以下ヘルプよりです。

>>バイト型 (Byte) は、バイナリ データを格納するためのデータ型として使用します。

ではどのような時にバイナリデータを格納する必要があるか、ですよね。


http://www.accessclub.jp/bbs/wforum2.cgi?mode=allread&no=37887&page=35

上記リンクは Access の掲示板ですが、PDF ファイルをコピーする進捗状況を
プログレスバーを使って表示する例が載っています。

Excel でもプログレスバーコントロールは使用可能ですので
上記リンクのコードを少し改変すれば試す事が可能です。

Byte 型の変数をInteger型で宣言すると、実行してもエラーは起きませんが
作成されるファイルが開けなくなってしまいます。

【30293】Re:Byte型について
発言  でれすけ  - 05/10/24(月) 16:48 -

引用なし
パスワード
   こんにちは。

▼小僧 さん:
>Byte 型の変数をInteger型で宣言すると、実行してもエラーは起きませんが
>作成されるファイルが開けなくなってしまいます。
揚げ足をとるようでもうしわけありませんが、補足させてください。

問題はByte型のサイズは1バイトで、Integer型は2バイトだということです。

今回の事例は、BianryモードげGetしてそのままPutするわけで、
その意味ではInteger型でも問題はありません。

Integer型を使う2バイト単位で処理するので、
ファイルサイズが奇数バイトのときに対応できないことになります。
「バイト単位で処理するときはByte型」です。

Byte型は0〜255までの正の整数しか表現できないので、
他にはあまり使い道は多くありません。

現在のPCでは、それくらいのメモリをケチってもしょうがないですし、
32bitCPUというのは、32bit単位で処理する時が一番速度が出るもんだと
おもいますし。たぶん。

Sub sample()

Const maxbufsize As Long = 1024
Dim buf() As Integer
Dim filelen As Long, bufsize As Long
Dim FilenameR As String, FilenameW As String
Dim fnR As Integer, fnW As Integer
Dim i As Integer

FilenameR = Application.GetOpenFilename("*.pdf,*.pdf,*.xls,*.xls,*.doc,*.doc,*.txt,*.txt", 1, "コピーするファイルを指定してください。")
If FilenameR = "False" Then Exit Sub

i = InStrRev(FilenameR, "\")
FilenameW = Left(FilenameR, i) & "コピー" & Mid(FilenameR, i + 1)

fnR = FreeFile
Open FilenameR For Binary As fnR
fnW = FreeFile
Open FilenameW For Binary As fnW
filelen = LOF(fnR)

Do While filelen > 0
 If filelen < maxbufsize Then
   bufsize = filelen
   If bufsize Mod 2 = 1 Then bufsize = bufsize + 1
   '最後の1バイトをおとさないように。 このとき、よけいな1バイトが付加される
 Else
   bufsize = maxbufsize
 End If
' ReDim buf(bufsize - 1)    'Byte型のとき
 ReDim buf(bufsize \ 2 - 1)  'Ineger型のとき
 Get fnR, , buf
 Put fnW, , buf
 filelen = filelen - bufsize
Loop
Close
End Sub

【30299】Re:Byte型について
質問  わさび  - 05/10/24(月) 18:44 -

引用なし
パスワード
   小僧さん、でれすけさん
回答をお寄せいただき、ありがとうございます。
おふたりのお話は私には高度すぎて理解できない部分が多いですのですが、
なんとなくわかってきたような気もします。

Openステートメントをヘルプで調べたら、
「filenumber」を「1〜511の範囲で任意のファイル番号を指定する」部分で、
Byte型が関わってくるんですね。
そして「1〜511」を範囲として含むので、
Integer型でも、はたまたLong型でも
ファイルサイズが偶数もしくは4の倍数なら大丈夫…という考えでよいのでしょうか。

>「バイト単位で処理するときはByte型」です。
とのことですが、
バイト単位での処理かどうかの判断は、
Openステートメントのようにヘルプに書いてあれば…という認識でいいのでしょうか。


また、でれすけさんのコードを追ってみたのですが、
以下の3点がヘルプや検索でうまくヒットせず、
何が行われているのかよくわかりません。
もしお時間がありましたら、解説いただけませんでしょうか。

>Dim buf() As Integer
> ReDim buf(bufsize \ 2 - 1)  'Ineger型のとき
型宣言のときに()をつけるのはどのような役割があるのでしょうか。
その上で、2行目は何が行われているのでしょうか。

>   If bufsize Mod 2 = 1 Then bufsize = bufsize + 1
この「Mod 2 = 1」とはどのようなことなんでしょうか。

> Get fnR, , buf
> Put fnW, , buf
どのような命令なのか、ヘルプでわかるのかなと思うのですが、
「Get」「Put」でヒットしません。
検索するキーワードだけでも教えていただければ幸いです。

人様の投稿に割り込んで質問ばかりで申し訳ないのですが、
どうかよろしくお願い致します。

【30301】Re:Byte型について 参加
発言  ichinose  - 05/10/24(月) 19:49 -

引用なし
パスワード
   ▼わさび さん、小僧さん、でれすけさん、こんばんは。

>回答をお寄せいただき、ありがとうございます。
>おふたりのお話は私には高度すぎて理解できない部分が多いですのですが、
>なんとなくわかってきたような気もします。
>
>Openステートメントをヘルプで調べたら、
>「filenumber」を「1〜511の範囲で任意のファイル番号を指定する」部分で、
>Byte型が関わってくるんですね。
>そして「1〜511」を範囲として含むので、
>Integer型でも、はたまたLong型でも
>ファイルサイズが偶数もしくは4の倍数なら大丈夫…という考えでよいのでしょうか。
う〜ん、確かにそうなんですが・・・。
これは、「今回の事例は、BianryモードげGetしてそのままPutするわけで、
その意味ではInteger型でも問題はありません。」
という限定であって、実際にバイナリーファイルをInteger型で
読み込む事ということはしませんね!!
なぜなら、

例えば、


以下のコードを実行して下さい。

'==================================================
Sub test1()
  Dim fno As Long
  Dim wbyte() As Byte
  fno = FreeFile()
  On Error Resume Next
  Kill ThisWorkbook.Path & "\test.bin"
  Open ThisWorkbook.Path & "\test.bin" For Binary As #fno
  ReDim wbyte(1)
  wbyte(0) = &H2
  wbyte(1) = &H1
  Put fno, , wbyte()
  Close #fno
End Sub

これは、ヘキサコードで、0201hという2バイト分のデータをファイルTest.Binに書き込んだコードです。
バイナリエディタ等で確認してみてください。
尚、Thisworkbook.Pathを使っているので一度マクロを含むブックは保存してから
実行してください。

次に
'=======================================================
Sub test2()
  Dim fno As Long
  Dim wbyte() As Byte
  fno = FreeFile()
  Open ThisWorkbook.Path & "\test.bin" For Binary As #fno
  ReDim wbyte(1)
  Get #fno, , wbyte()
  Close #fno
  MsgBox wbyte(0) & "---" & wbyte(1)
  
End Sub


これは、確認のために読み込んでみたコードです。

wbyte(0)には、2H Wbyte(1)には、1H
が格納され、正しくファイルが作成された事が確認できます。


では、次に同じファイルを

'============================================================
Sub test3()
  Dim fno As Long
  fno = FreeFile()
  Dim dat As Integer
  Dim dat2 As Integer
  Open ThisWorkbook.Path & "\test.bin" For Binary As #fno
  Get fno, , dat
  Close #fno
  MsgBox dat
End Sub


Integer型の変数で読み込むと
258なんてどこから来たのかと思うような値が表示されますよね?


ファイル内で0201Hの2バイトは、Integer型の変数に読み込まれると、
Integer型の内部では0102hとして格納されます。

よって、16進数で0102は、10進数の258ですから、そう表示されるのですが・・。

バイナリーファイルというのは、設計によっては、0201Hに意味がある場合も
ありますから、Integer型で読み込むというのは、特殊な場合に限りますよ!!

【30314】Re:Byte型について
発言  でれすけ  - 05/10/25(火) 9:45 -

引用なし
パスワード
   おはようございます。

>「filenumber」を「1〜511の範囲で任意のファイル番号を指定する」部分で、
>Byte型が関わってくるんですね。
違います。

>バイト単位での処理かどうかの判断は、
>Openステートメントのようにヘルプに書いてあれば…という認識でいいのでしょうか。
違います。
自分が作るマクロの目的によって、バイト単位にで処理する必要があるときに
バイト型を使用するということです。

>型宣言のときに()をつけるのはどのような役割があるのでしょうか。
>その上で、2行目は何が行われているのでしょうか。
型宣言時に、変数名に()を付ける場合、配列になります。
 配列の大きさを指定していない場合、動的配列になり、
 後で、Redimステートメントで大きさを指定します。

>その上で、2行目は何が行われているのでしょうか。
配列の大きさ(配列要素の数)を指定しています。

バッファサイズを1024バイト(bufsize=1024)とするとき、
バッファをByte型で宣言している時
Redim buf(bufsize-1)  ' つまり Redim buf ( 0 to 1023)
1バイト×1024要素で1024バイトのバッファが確保されます。

バッファがInteger型で宣言しているとき
Redim buf(bufsize \ 2 -1 )  ' つまり Redim buf ( 0 to 511 )
で2バイト×512要素で1024バイトのバッファが確保されます。

このマクロはファイルを1024バイトづつに区切って
読み込みと書き出しを繰り返しています。
で、最後に例えば3バイト残ったとすると、

Byte型のバッファであれば、ちょうと3バイト分のバッファを確保できます。
 (Rdim Buf(bufsize-1) で 変数bufsizeの値が3だから)
ところが、Integer型だと、バッファサイズを
 Redim buf(bufsize \ 2 -1 )
で確保しているとので、変数bufsizeの値が3だと bufsize \ 2 -1 = 0 ですから
 Redim buf( 0 to 0 )
となって、2バイト×1要素=2バイトのバッファサイズしか確保できないことになります。
なので、
If bufsize Mod 2 = 1 Then bufsize = bufsize + 1
で、bufsizeが3の様な奇数のときは、バッファを多めに確保するように調整します。
Mod演算子は、割り算のあまりを計算する演算子です。
bufsize Mod 2 = 1は、bufsizeを2で割った余りが1
ということです。

>「Get」「Put」でヒットしません。
Openステートメントからたどって下さい。

疑問点に答えることが出来たでしょうか。

【30355】Re:Byte型について 参加
お礼  わさび  - 05/10/25(火) 18:24 -

引用なし
パスワード
   >ファイル内で0201Hの2バイトは、Integer型の変数に読み込まれると、
>Integer型の内部では0102hとして格納されます。
>
>よって、16進数で0102は、10進数の258ですから、そう表示されるのですが・・。
>
>バイナリーファイルというのは、設計によっては、0201Hに意味がある場合も
>ありますから、Integer型で読み込むというのは、特殊な場合に限りますよ!!

Byte型は16進数、Integer型は10進数…
ここにきてやっとそのことを理解するあたり、私はなってないですね…
でもおかげでByte型の必要性がわかりました。
これからも、もっともっと精進します。
ありがとうございました!

【30358】Re:Byte型について
お礼  わさび  - 05/10/25(火) 19:04 -

引用なし
パスワード
   >自分が作るマクロの目的によって、バイト単位にで処理する必要があるときに
>バイト型を使用するということです。

こういうときはByte型、こういうときはInteger型、…といったように、
大方パターン化されているものなのかと思っていましたが、
もっと別次元の話、いうなれば情報処理という大きな次元での話なんですね。
かなり見当違いな質問ばかりですみませんでした。
もっともっと精進いたします。


・型宣言時に変数名に()を付ける
・Mod
・GetとPut
は、おかげさまで理解できました。
特に「型宣言時に変数名に()を付ける」の詳細な解説、よくわかりました。
本当にありがとうございました。

【30359】Re:Byte型について 参加
発言  ichinose  - 05/10/25(火) 19:23 -

引用なし
パスワード
   ▼わさび さん:
こんばんは。
>>ファイル内で0201Hの2バイトは、Integer型の変数に読み込まれると、
>>Integer型の内部では0102hとして格納されます。
>>
>>よって、16進数で0102は、10進数の258ですから、そう表示されるのですが・・。
>>
>>バイナリーファイルというのは、設計によっては、0201Hに意味がある場合も
>>ありますから、Integer型で読み込むというのは、特殊な場合に限りますよ!!
>
>Byte型は16進数、Integer型は10進数…
この表現・・・、まだ違います。
VBAでは、Byte型でもInteger型でも
16進表記、10進表記のいずれも可能です。
そもそも
>Byte型は16進数、Integer型は10進数…
こういう区別の仕方をしてはいけません。
これは、表記の仕方の違いです。


私の説明にも問題があったかもしれません・・・、反省。

VBAがこういうデータ型の問題がわかりずらいのは、
簡単に型変換してくれることも理由のひとつだと思っているのですが・・。

話がちょっとずれますが例えば、

dim aa as integer
dim bb as string
aa=5
bb="text" & aa

これもaaを型変換してくれるのでエラーになりませんよね?

私がDOS時代に使っていたBASICでは、「型が違う」というエラーになりました。

VBAから、プログラミングを始めてあまり細かい意味は考えずに使っている間は
便利なんですが、あるとき不思議に感じはじめるとやっかいですよね!!

今回の問題は、ファイルの中身が実際にどのようになっているのか?

なんてことは、VBAではあまり考えなくてもすんでいる方は
沢山いらっしゃると思います。
(私もVBAを始めてからはそうです)

再度、似たような投稿があったときには
もう少しわかりやすい説明ができるように
したいと思いますが、Byte型はある程度
決まった使用方法だけ(今回のバイナリファイルのデータ取得での使用方法等)
押さえておいてください。

【30368】Re:Byte型について 参加
お礼  わさび  - 05/10/26(水) 8:30 -

引用なし
パスワード
   >>Byte型は16進数、Integer型は10進数…
>この表現・・・、まだ違います。
>VBAでは、Byte型でもInteger型でも
>16進表記、10進表記のいずれも可能です。
>そもそも
>>Byte型は16進数、Integer型は10進数…
>こういう区別の仕方をしてはいけません。
>これは、表記の仕方の違いです。

>VBAがこういうデータ型の問題がわかりずらいのは、
>簡単に型変換してくれることも理由のひとつだと思っているのですが・・。

あわわわわ…違いましたか。
簡単に型変換してくれる、その便利さの真髄に
私のような素人が足を突っ込んでしまったのですね。
でもそんな私にichinoseさんをはじめ、
いろんな方にご指南いただき、本当にありがとうございます。


>VBAから、プログラミングを始めてあまり細かい意味は考えずに使っている間は
>便利なんですが、あるとき不思議に感じはじめるとやっかいですよね!!

本当にそのとおりで、やっかいです(^^;


>再度、似たような投稿があったときには
>もう少しわかりやすい説明ができるように
>したいと思いますが、Byte型はある程度
>決まった使用方法だけ(今回のバイナリファイルのデータ取得での使用方法等)
>押さえておいてください。

はい。
当面は、どんなときにByte型を使わないといけないのかを気にしながら、
今後もこちらのサイトで勉強させていただきます。
ありがとうございました。

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