これは、データベースによくある仕様です。私の会社の業務系システムも、そのような仕様になっています。
このデータ先頭に付いているアポストロフィーは、いったい何者なのか?
それは、データを文字列型とする働きをする書式設定制御文字です。ですから、データがたとえ数字であっても、アポストロフィーがくっ付いたままでは、足し算、引き算、合計などの計算ができません。数値ではなく、文字列となっているからです。
以上の詳細は、
⇒ こちらの記事をご覧ください。
アポストロフィー付きデータでも、計算できるようにする対処策は、いくつかあります。
ただ、毎回毎回、手作業でやるのは面倒なので、Excelマクロ(VBA)で自動実行する方法を思いつきました。
「データ型変換」という方法です。
具体的には、「CInt」関数や、「CLng」関数を使います。
これらの関数によって、データの型が「文字列」型から「整数型」や「長整数型」に、つまり数値に変換されます。よって、アポストロフィー付きデータであっても、計算が可能となります。
例えば、次のようなデータがあったとします。
このデータから、山口さんの合計を求めたい場合です。
1 '野口 '54923
2 '山口 '99232
3 '野口 '20939
4 '西城 '80003
5 '桜田 '89923
6 '山口 '23497
7 '西城 '56700
8 '野口 '23981
9 '山口 '43998
通常のデータ(アポストロフィーのない場合)だと、次のVBAコードで、合計を求めることができます。
Dim i As Integer
Dim myKK As Long
myKK = 0
For i = 1 To 9
If Cells(i, 2).Value = "山口" Then
myKK = myKK + Cells(i, 3).Value
End If
Next i
MsgBox "山口合計は" & myKK
ところが、データにアポストロフィーが付いているために、上記コードでは計算をしてくれません。
そこで、どうするか。
「CLng」関数を使います。
上記コード中の、Cells(i, 3)データを、「CLng」関数を使って数値に変換します。
CLng(Cells(i, 3).Value)
と、すればOKです。
修正版コードは、次のとおりとなります。
Dim i As Integer
Dim myKK As Long
myKK = 0
For i = 1 To 9
If Cells(i, 2).Value = "山口" Then
myKK = myKK + CLng(Cells(i, 3).Value)
End If
Next i
MsgBox "山口合計は" & myKK
このコードだと、まともに動きます。手作業は不要で、クリック一つで自動計算してくれます。
【補足1】
アポストロフィー付きデータによる条件分岐
「山口」というデータの頭に「'」(アポストロフィー)が付いているので、
If Cells(i, 2).Value Like "*山口" Then
と記述すべき気がします。
もちろん、これでも動きます。
けれども、
If Cells(i, 2).Value = "山口" Then
というコードでも、正常に動いてくれます。
このことからも、データ先頭のアポストロフィーは、通常の文字ではないことが分かります。
【補足2】
「CInt」と「CLng」のどちらを使うべきか。
扱う数値の範囲によって、使い分ける、というのが一応の答えです。
つまり、-32,768~32,767の範囲の数値であれば、「CInt」
-2,147,483,648~2,147,483,647の範囲の数値であれば、「CLng」
です。
そうすると、今回のブログ記事のデータ例では、「CInt」を使用するのが原則です。
けど、「CLng」でも支障ありません。
それでは、また次の記事で
■■■■ goosyun ■■■■
最近の「VBAプログラミング・マクロ」カテゴリーもっと見る
最近の記事
カテゴリー
バックナンバー
人気記事