AIと戦って、あなたの人生のリスク診断 >>

いつもお世話様です。
エクセルVBAでFormatを使うと、文字列中にeが一つ入っていると、「指数」とみなされて勝手に数値に化けてしまうようです。
話を簡単にするため、問題のコートを簡易化したコードが下記のtest1です。
入力されるのは常に3文字以内の英数です。

test1のコードは、ab9と入れればAB9、01とか20とか入れると、予定通り001や020を返してくれます。
ところが、なかには1E1や4E3なども入力する必要があり、これを入れると010や4000に化けてしまいます。
現在は、対処するため、下記test2のように、文字列中に"E"があるかどうかで処理を分岐させていますが、ほかに何か良い方法はないでしょうか?

Sub test1()
Dim x As String, y As String, z As String
x = Application.InputBox("CODEを入力してねん。", Type:=2)
y = StrConv(StrConv(x, vbUpperCase), vbNarrow)
z = Format(y, "000")
MsgBox z & " Typeだよ。"
End Sub

Sub test2()
Dim x As String, y As String, z As String
x = Application.InputBox("CODEを入力してねん。", Type:=2)
y = StrConv(StrConv(x, vbUpperCase), vbNarrow)
If InStr(y, "E") > 0 Then
z = y
Else
z = Format(y, "000")
End If
MsgBox z & " Typeだよ。"
End Sub

このQ&Aに関連する最新のQ&A

A 回答 (6件)

エキスパートさん、こんにちは。



FORMAT関数をまだ自分のものにしておりませぬね。
と、ちょっときついことを言ってみる。(^^;;;

Format(y,"000") は、数値表示書式指定文字を使ってますから
文字列1E2(10^2)も数字になります。

質問には英数混合3桁の例で、ab9 とありますが
英数混合で3桁未満はどう表示するのでしょうか?

 ab → 0AB  → ■AB  → AB
 b  → 00B  → ■■B  → B
 1a → 01A  → ■1A  → 1A

■はスペース

3桁未満の表示の仕方によっては、#1の回答も
単純には使えないことはお分かりですね。

(おまけ)
いまのままで 1a とか 1p を試したみてください。

何れにしろ分岐が必要になると思われます。
以上です。

 
    • good
    • 0
この回答へのお礼

これはこれは、kobouzu_su様、いつも有難うございます。
1a とか 1p も化けるんですね!亜茶^2!!
これは指数じゃないですよね?な、なんなのでしょう?
先頭に0をつけるのはあくまで数字だけの場合ですので1Aや1Pはそのまま表示されればいいのです。

試行錯誤の結果、以下のように対応しましたがこれで正解でしょうか?

Sub test5()
Dim x As String, y As String, z As String
x = Application.InputBox("CODEを入力してねん。", Type:=2)
If Len(Trim(x)) > 3 Then
MsgBox "そんな長いTypeCode知りませぬ。", vbCritical, " (; ´・ω・`)σ" & x
Exit Sub
End If
y = StrConv(StrConv(x, vbUpperCase), vbNarrow)
z = IIf(IsNumeric(y), Right$("000" & y, 3), y)
MsgBox z & " Typeだよ。", , " ( ̄ー ̄)v "
End Sub

お礼日時:2007/06/18 17:18

エキスパートさん、こんにちは。



>Trim関数は文字列の先頭と末尾のスペースだけ削除するんですよね
>なら真中の■に影響ないのでは?

(■はスペース)

2■5 → 025 

と変換したい場合は問題ありですよね、ということでした。
3桁未満の数字の頭には、0を付けるということでしたので。
そうでなければ問題なしです。

何れにしろ数値を判定させるのはなかなかのものですね。
以上です。
 
    • good
    • 0
この回答へのお礼

kobouzu_suさま、有難うございました。
ご迷惑でしょうが、これからも末永くご指導くださいませ。

お礼日時:2007/06/19 13:44

> Eは指数表示というのは存じてましたが、Dは何なのですか?



「D」も「E」もともに指数を表しています。両者の違いは、

 ・E  有効桁数が Single(単精度)の指数
 ・D  有効桁数が Double(倍精度)の指数

です。

> 1Pや1Aもわかりません。

これは IsNumeric の問題ではありません。Format の問題ですね。
こちらについては、kobouzu_su さんが詳しく回答なさってます。

以下は余談までに。

IsNumeric 関数は仕様として、指数表記の文字、小数点、桁区切り
のカンマなども数値として評価します。

つまり、、

IsNumeric 関数はあくまで「数値として評価できるか」を判定する
関数であって、判定対象が必ずしも数字で構成されていることを
保証しません。

これはこれで都合が良いことも多いのですが、例えばデータベース
絡みの処理を考えてみると、整数フィールドに値を代入する SQL
を発行する場合に、指数表記の文字などが混入すると SQL でコケ
るか、間違った値が保存されてしまいます。
単純に IsNumeric でしか入力チェックしてないとスルーしちゃうん
ですね...

このような心配があるときは、#3 の参考 URL にある IsDigit の
ような自前関数を作ってチェックを行う必要があります。

IsNumeric にバグがある訳ではなく、あくまで仕様なのですが、
このことを理解していないと、思いもよらない結果を返すという話
になってしまいます。

 # 同じように IsDate 関数も英語表記の日付式で True を返します。

結局は、仕様を良く理解した上で利用する...「上手に使え」という
ことになってしまうのですが^^;

ご参考までに、正規表現を使った例です。

Sub test6()
  Dim x As String
  Dim y As Variant
  
  x = Application.InputBox("CODEを入力してねん。", Type:=2)
  v = CheckCode(x)
  If VarType(v) = vbBoolean Then
    MsgBox "(; ´・ω・`)σ不正値みたい", vbCritical
  Else
    MsgBox CStr(v) & " Typeだよ。", vbInformation, " ( ̄ー ̄)v "
  End If
  
End Sub

' // Code チェック関数
Private Function CheckCode( _
    ByVal sCode As String _
) As Variant
  
  ' // コードの長さ(文字数)
  Const MAX_DIGIT As Long = 3&
  
  CheckCode = False
  ' // 引数 sCode が3文字より多ければ終了
  If Len(sCode) > MAX_DIGIT Then Exit Function
  
  ' // 前後の不要スペース除去・半角大文字に補正
  sCode = Trim(sCode)
  sCode = StrConv(sCode, vbUpperCase Or vbNarrow)
  
  ' // 正規表現で入力チェック
  Dim reg As RegExp
  Set reg = CreateObject("VBScript.RegExp")
  reg.Pattern = "^[0-9]+$"
  If reg.test(sCode) Then
    ' // Return: 数字のみの場合-->桁数補正
    CheckCode = Right$(String$(MAX_DIGIT, "0") & sCode, MAX_DIGIT)
  Else
    ' // Return: 数字以外が含まれる場合
    ' //     規定の文字以外がないかチェック
    reg.Pattern = "^[0-9A-Z]+$"
    If reg.test(sCode) Then
      CheckCode = sCode
    End If
  End If
  Set reg = Nothing

End Function
    • good
    • 0
この回答へのお礼

KenKen_SPさま、ご丁寧に有難うございます。
「正規表現」というのはまったく馴染みがないのですが、これもいずれ勉強したいと思います。

今回も有難うございました。

お礼日時:2007/06/19 09:50

またまた登場、kobouzuです。

(^o^)/

KenKen_SPさんまで登場してくださるとは、エキスパートさんはなんと幸せものでしょう。
鬼に金棒とは、こういう状況を言ふのですよねぇ。
あと、一人、登場されると、金棒2本ですね。
ということで、当方への質問のみの返答ということで。
2a と 3p とかと、Format(y,"000")の関係について。

以下をお試しください。

Sub test()
 Dim y
 y = "2a"  ''' y = "5p"
 Range("A1").Value = Format(y, "0.0000000")
 Range("A2").Value = Format(y, "0.0000000")
 Range("A2").NumberFormat = "hh:mm:ss"
End Sub

どうでせしょう。お分かりになりましたか?

それから、
>If Len(Trim(x)) > 3 Then

>y = StrConv(StrConv(Trim(x), vbUpperCase), vbNarrow)

Trimはあまり感心しませんね。
2■5 とかが上手くいかないですよね。

それと細かいことですが、vbUpperCase,vbNarrowは次のように
y = StrConv(????, vbUpperCase+vbNarrow)
と、+で結合して使うのがふつうです。

以上です。
 
    • good
    • 0
この回答へのお礼

kobouzuさま、いつも有難うございます。
素晴らしい知識のみなさまに教えていただき「質問のエキスパート」?は非常に助かっております。

IsNumericではFalseになるけど、Formatすると、2Aは午前二時、3Pは午後3時なんですね!初めて知りました。おどろきました。

> Trimはあまり感心しませんね。
> 2■5 とかが上手くいかないですよね。

すみません、これはちょっとわかりませんでした。
■は、スペースの意味ですか?
Trim関数は文字列の先頭と末尾のスペースだけ削除するんですよね?なら真中の■に影響ないのでは?それとも他の問題でしょうか?

MsgBox StrConv("abc", vbUpperCase + vbNarrow) と、+で結合して使えるんですね!!これも初めて知りました。おどろき^2 です。

お礼日時:2007/06/19 09:40

こんにちは。



どうせならもう一歩踏み込んでみては?

[つっこみ] IsNumeric だけでは不十分(意地悪じゃないですよ^^;)

  例).12、+12、-12、!!!

[ご提案] 規定の文字以外を弾くチェック関数を作ってみては?

  ・方法1: 正規表現を使ってみる
        CreateObject("VBScript.RegExp")
        Test メソッド
        マッチングパターン: [0-9A-Z]{,3}
       
  ・方法2: 一文字ずつ Mid で取り出して判定
        Like 演算子を使ってみる、または文字リストを作っておき、
        それと比較する
        文字列長は3文字判定しておく

[参考URL:]
http://homepage1.nifty.com/rucio/main/technique/ …

この回答への補足

すみません。勘違いでした。お礼で書いたABSは使えませんね。
また3D2や3E2もFALSEではなくTRUEでした。
ただ、1Pや1AはFALSEです。

Dは何なのですか?また1Pや1Aも何なのでしょうか?という質問です。
よろしくお願いいたします。

補足日時:2007/06/18 23:20
    • good
    • 0
この回答へのお礼

ご指摘有難うございました。いろいろ問題ありますねえ!
今回は、Typeの誤入力を防ぐ方法ではなく、入力した1E1等がが化けることが問題なので.12、+12、-12は特に差し支えありません。(一応ABSで対処はしましたが)

参考URLを見ましたが、Eだけじゃなく3D2のようなのも数値に化けるんですね!これは問題です。Eは指数表示というのは存じてましたが、Dは何なのですか?さきほどの1Pや1Aもわかりません。よろしかったらご教示ください。

また、参考URL ではIsNumericでTRUEとなると書かれた3D2や3E2が下記のコードではFALSEとなるようですが何故でしょうか?

Sub test6()
Dim x As String, y As String, z As String
x = Application.InputBox("CODEを入力してねん。", Type:=2) ')
If Len(Trim(x)) > 3 Then
MsgBox "そんな長いTypeCode知りませぬ。", vbCritical, " (; ´・ω・`)σ" & x
Exit Sub
End If
y = StrConv(StrConv(Trim(x), vbUpperCase), vbNarrow)
If IsNumeric(y) Then
z = Right$("000" & Abs(y), 3)
Else
z = y
End If
MsgBox z & " Typeだよ。", , " ( ̄ー ̄)v "
End Sub

お礼日時:2007/06/18 22:36

素直に


z = Right$("000" & y, 3)
ではどうですか?
    • good
    • 0
この回答へのお礼

阿茶!
そうかあ、何もFormatする必要がなかったんだぁ!

・・・でも、目からうろこです。
有難うございました。

お礼日時:2007/06/18 14:30

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QExcelで数値→文字列変換で指数表示になったものをいっぺんに直したい

Excelについての質問です。

他のシートからコピー&ペーストした13桁の数字の羅列データ(JANコードまがいのものです)をまた別のシートの同様のデータと文字列としてマッチングをしようとしています。

ただ、コピペ元のデータが数値と文字列が混在していてコピペ後にセルの書式設定で列を一括で文字列に設定すると「2.01E+12」のように指数表示になってしまうものがありました。
一つずつダブルクリックすれば元の数字に戻るのですが、なにしろ数が多く面倒なものでなんとかいっぺんに指数表示から元の数字に変換することができないものでしょうか。

ちなみにOSはWin2000、Excelも2000を使用しています。

今回はコピペしてしまった後の対処方法をお尋ねしていますが、コピペ時にこうすれば良いというような回避方法もありましたら併せてご回答頂ければ幸いです。

Aベストアンサー

範囲を選択、
[データ]-[区切り位置]
で区切りされないように適当な設定をし、形式を「文字列」にすると、

> 一つずつダブルクリックすれば元の数字に戻るのですが、

と同じ効果が得られるようです。

QExcelで指数表現しないようにする方法

こんにちは。
csvファイルに 10E098 という文字列がある場合、
このファイルをダブルクリックしてExcelで表示すると
1.00E+99 のように指数形式で表示されてしまいます。
(セルのプロパティも「指数」になっています)
そのまま 10E098 という文字列で表示するようにしたいのですが
どのようにすればよいのでしょうか?
ちなみに、該当のセルの表示形式を「標準」にしても「文字列」に
しても 1E+99 と表示されてしまって出来ませんでした。
よろしくお願いいたします。

Aベストアンサー

CSVファイルを読み込むときに普通に読み込むと数値を見なして1E+99になりますので、文字列として読み込んだらいかがですか

「データ」→「区切り位置」を選択し「カンマやタブなどの…」を選択する。ウィザード2/3画面で区切り文字「カンマ」にチェックを入れ、3/3画面でその数値のある列を「文字列」にします

この文字列を数値にするなら以下のような式で可能です
=VALUE(LEFT(A1,FIND("E",A1)-1))*10^VALUE(RIGHT(A1,LEN(A1)-FIND("E",A1)))

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QVBAにてデータが数字か文字かを判定するには

VBAにてデータが数字か文字かを判定するには、
どうすれば良いのでしょうか?

文字数は任意で決まっていません。


123 ← 数字
あい ← 文字
1F  ← 文字
G  ← 文字

Aベストアンサー

こんにちは。

数字か文字かなら、IsNumeric でよいと思いますが、数値か文字かでしたら、VarType を使います。私の場合は、IsNumericは、めったに使いません。VarTypeのほうが多いですね。IsNumeric は、文字通り、文字か数字かで、文字列書式の数字も含まれます。なお、VBAでは、数字は、数値型に型キャストされますので、特に問題は発生しません。

ご参考までに。

Sub Test()
 If VarType(Range("A1").Value) = vbDouble Then
  MsgBox "数値"
 ElseIf VarType(Range("A1").Value) = vbString Then
  MsgBox "文字列"
 Else
  MsgBox "その他" '代表的なものはエラー値です
 End If
End Sub

-----------------------------------------
こちらの場合は、全角数字も、数字として扱われます。

Sub Test2()
 If IsNumeric(Range("A1").Value) Then
   MsgBox "数字"
 Else
   MsgBox "数字ではない"
 End If
End Sub

こんにちは。

数字か文字かなら、IsNumeric でよいと思いますが、数値か文字かでしたら、VarType を使います。私の場合は、IsNumericは、めったに使いません。VarTypeのほうが多いですね。IsNumeric は、文字通り、文字か数字かで、文字列書式の数字も含まれます。なお、VBAでは、数字は、数値型に型キャストされますので、特に問題は発生しません。

ご参考までに。

Sub Test()
 If VarType(Range("A1").Value) = vbDouble Then
  MsgBox "数値"
 ElseIf VarType(Range("A1").Value) = vbString Th...続きを読む

QVBAで文字列を数値に変換したい

A列とE列の文字列になってしまった数値を
数値に変換したく、以下のようなものを作ったのですが、
文字の無いセルまで、数値に変換しようとするので
時間がかなりかかります。
何かよい方法は無いでしょうか?
よろしくお願いいたします。


Sub 数値に変換()
Range("A:A,E:E").Select
For Each xCell In Selection
xCell.Value = xCell.Value
Next xCell
End Sub

使用ソフトEXCEL2000orEXCEL2003

Aベストアンサー

>Range("A:A", "E:E")
これは、A、B,C,D,E列のことなので
A列とE列であれば質問者のようにRange("A:A,E:E")です。

ま、それはそれとして、回答。

Sub Test()
 Range("A:A").Value = Range("A:A").Value
 Range("E:E").Value = Range("E:E").Value
End Sub

以上。
 

QVBA 実行時エラー1004 rangeメソッドは失敗しました。globalオブジェクトのエラー

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義がまずいと思うのですが、それ以上の事は分かりません。どなたか、分かる方がおりましたら、よろしくお願いします。また、プログラムは以下のようになります。

Sub 繰り返し()
'繰り返し
Dim s As Integer
For s = 0 To 17
Range("cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)").Select
Range("cells(8,s+2)").Activate
Charts.Add
ActiveChart.ChartType = xlXYScatter
ActiveChart.SetSourceData Source:=Sheets("20081216_210647").Range( _
"cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)"), PlotBy:=xlColumns
ActiveChart.SeriesCollection(1).Name = "=""0810p2x"""
ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="0810p2x"
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "0810p2x"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "t"
.Axes(xlValue, xlPrimary).HasTitle = False
End With
Next
End Sub

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義...続きを読む

Aベストアンサー

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな(Excelで表示されている)シートが上位オブジェクトとして、自動的に認識されます。

≪例2≫
Sheets("Sheet2").Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、Rangeのみシート名が記述されています。
Sheets("Sheet2").Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
Activeなシートが、Sheet2の場合はエラーになりません。
しかし、ActiveなシートがSheet2以外の場合、エラーが発生します。
直前に、
Sheets("Sheet1").Select
などとしていれば、ActiveシートがSheet1になっていますから、エラーになります。

Sheets("Sheet2").Range(Sheets("Sheet2").Cells(8, 1), Sheets("Sheet2").Cells(1587, 2)).Select
と書いておけば安心です。
Withステートメントを使えばスッキリ纏めることができます。
With Sheets("Sheet2")
  .Range(.Cells(8, 1), .Cells(1587, 2)).Select
End With

# Sheets("Sheet2")の上位オブジェクトが省略されていることにも気がついてください。

>そこで自分で基礎を勉強したいのですが推薦できる参考書などがござ
>いましたら、教えていただけませんか?
私自身は、入門書程度の雑誌を1冊買っただけです。どれが良いとかはよく分かりません。
「マクロの記録」を活用して、参考コードを取得し、汎用性のあるコードに編集しています。
新しい単語があれば、文字カーソルを単語の上に置き、F1キーを押してVBAのヘルプを必ず見るようにしています。
躓いた時は、Web検索して欲しい情報を得たり、あるいは、こうした掲示板で先輩方のお力をお借りしています。

Excel(エクセル)VBA入門:目次
http://oshiete1.goo.ne.jp/kotaeru_reply.php3?q=4651404
エクセル入門・初級編
http://www.kenzo30.com/excel_kiso.htm

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな...続きを読む

QExcelで3E8を3.00E+8にしない方法を教えてください。

Excel2000および2003で数値の「1000」をDEC2HEX関数を使用して16進の「03E8」に変換し、これをカンマ区切りのcsvファイルで保存したいのですが「CSVと互換性のない機能が含まれている可能性があります。」と表示され、そのまま保存すると、セルの内容が「3.00E+8」の指数形式に変わってしまいます。
指数形式ではなく、文字列で03E8と保存する方法はないのでしょうか?
ご存知の方よろしくお願いいたします。

Aベストアンサー

CSVに書き出した場合、文字列3E8はそのまま文字列3E8として保存さ
れています。しかしそれをExcelで開くと、文字列3E8を勝手に数値
3.00E+08と解釈して、変換されてしまいます。これはExcelのいつも
の「でっかいお世話」機能ですので、回避するには当該ファイルが
CSVじゃなくてテキストファイルだよと見せかけて、ウィザードを経
由して読み込むしかありません。

Microsoft製ではないあらゆるソフトでは正しく3E8という文字列と
して扱ってくれますので、CSVに書き出す目的が他のソフトへのデー
タの移動でしたら、CSVをExcelで開くのは危険とだけ憶えて、ほっ
といていいです。

どうしてもExcelに戻す必要がある場合、私なら16進表記の数値であ
ることを示す意味でも「0x03E8」と書きますね。これならExcelには
何のことだか判らないので、勝手なことをされません。
=REPLACE("0x0000",7-LEN(DEC2HEX(A2)),LEN(DEC2HEX(A2)),DEC2HEX(A2))

CSVに書き出した場合、文字列3E8はそのまま文字列3E8として保存さ
れています。しかしそれをExcelで開くと、文字列3E8を勝手に数値
3.00E+08と解釈して、変換されてしまいます。これはExcelのいつも
の「でっかいお世話」機能ですので、回避するには当該ファイルが
CSVじゃなくてテキストファイルだよと見せかけて、ウィザードを経
由して読み込むしかありません。

Microsoft製ではないあらゆるソフトでは正しく3E8という文字列と
して扱ってくれますので、CSVに書き出す目的が他のソフトへのデー
タの...続きを読む

QVBAで行コピーして挿入

1行目の内容をコピーして、他の場所に指定数分だけ
挿入するマクロを作りました。

そのマクロ自体は、正しく動いたのですが、コピー元の1行目に
他のシートを参照する関数が入っていた場合、想定どおりの
結果を得ることができません。

[SHEET1:データのみを記載]
省略

[SHEET2]
A1セル:   =SHEET1!$A1 ←コピー元の行

[マクロ:一部抜粋]
myR = Application.InputBox("挿入する行数を入れてください", , "1")

For i = 1 To myR
  Rows("1:1").Copy
  Cells(ActiveCell.Row, 1).Select
  Selection.Insert Shift:=xlDown
  Selection.EntireRow.Hidden = False
Next i

どういう結果を求めたいかというと、たとえば、
SHEET2のA10セル上で、このマクロを実行し、 "挿入行 = 3" と指定したら

A10:   =SHEET1!$A10
A11:   =SHEET1!$A11
A12:   =SHEET1!$A12

となってほしかったのですが、結果は、

A10:   =SHEET1!$A10
A11:   =SHEET1!$A10
A12:   =SHEET1!$A10

となってしまいました。

どうにか、求める結果を得られるようにできないでしょうか?

1行目の内容をコピーして、他の場所に指定数分だけ
挿入するマクロを作りました。

そのマクロ自体は、正しく動いたのですが、コピー元の1行目に
他のシートを参照する関数が入っていた場合、想定どおりの
結果を得ることができません。

[SHEET1:データのみを記載]
省略

[SHEET2]
A1セル:   =SHEET1!$A1 ←コピー元の行

[マクロ:一部抜粋]
myR = Application.InputBox("挿入する行数を入れてください", , "1")

For i = 1 To myR
  Rows("1:1").Copy
  Cells(ActiveCell.Row, 1).S...続きを読む

Aベストアンサー

Active.Cellが同一の位置なのだから相対変位しません。

一例です。(ループは不要なので削除しました)
myR = Application.InputBox("挿入する行数を入れてください", , "1")
Rows("1:1").Copy
Rows(ActiveCell.Row & ":" & ActiveCell.Row + myR - 1).Select
Selection.Insert Shift:=xlDown
Application.CutCopyMode = False

Q数値かどうかを取得したい IsNumberではダメ

Sub Macro2()
Dim mystr As String

mystr = "1"
If IsDate(mystr) = False Then
MsgBox "NO"
End If

End Sub

これなら日付型かどうかを取得できるのに、

Sub Macro1()
Dim mystr As String

mystr = "1"
If IsNumber(mystr) = False Then
MsgBox "NO"
End If

End Sub
だと、IsNumberがコンパイルエラーになります。

変数に入っている値が数値として評価できるかを取得する方法を教えてください。

Aベストアンサー

こんにちは。

これは初歩的なことではあっても、最初はなかなか手こずります。こういうことは、教えもらったほうが早いようです。

#2さんのおっしゃる通り、IsNumberは、ワークシート関数ですから、VBA上での使い方はお分かりになるとは思いますが、しかし、私は、VBAでは、IsNumber は使いません。

ただし、Cells のText プロパティでも同じ反応ですが、String型のデフォルト値は、""(長さ0の文字列)です。基本的には、String型で値を取ることはしません。それに、ふつうは、Cellsから直接取り出すことは避けたほがいいです。一端、変数に入れてから、判定させたほうがよいです。ワークシートの数式は、関数に関数を重ねますが、VBAなどの言語では、あまり関数や数式をネストしないほうがよいと言われます。

IsNumeric VBA関数は、少し意味合いが違います。「[数字]かどうか」という判定で、「[数値]かどうか」ではありません。もちろん、以下のようなワークシート関数を応用したコードはあるとは思いますが、これだと、他のVBAやVBでは応用できません。(英語で考えると変ですね。数値というのは、"Numeric"です。数字は、"Figure" です。もしかしたら、名前付けの時に間違えたかもしれません。(^^;)

'//
Sub Macro3()
Dim myVal As Variant
Dim myVal2 As Double
 myVal = "1"
 If WorksheetFunction.IsNumber(myVal) Then
   MsgBox myVal2
 Else
  MsgBox "Not Numeric: " & myVal
 End If
End Sub

'VBA関数を使う場合は、上記とはマクロとしての目的が違いますが、このようにします。
'あえて、Double型にしましたが、不要な場合はLong型にしてもよいです。

Sub Macro4()
Dim myVal As Variant
Dim myVal2 As Double
 myVal = "1"
 If IsNumeric(myVal) Then
  myVal2 = CDbl(myVal) '直接入れるわけにはいかないし、Val関数を使うと丸められてしまう。
  MsgBox myVal2
 Else
  MsgBox "Not Numeric: " & myVal
 End If
End Sub

'//
'なお、Macro3,4 の Dim mystr As String は myVal As Variant にしました。
'String型なのに、他のものを入れても同じことですから。

こんにちは。

これは初歩的なことではあっても、最初はなかなか手こずります。こういうことは、教えもらったほうが早いようです。

#2さんのおっしゃる通り、IsNumberは、ワークシート関数ですから、VBA上での使い方はお分かりになるとは思いますが、しかし、私は、VBAでは、IsNumber は使いません。

ただし、Cells のText プロパティでも同じ反応ですが、String型のデフォルト値は、""(長さ0の文字列)です。基本的には、String型で値を取ることはしません。それに、ふつうは、Cellsから直接取り出すことは避け...続きを読む


人気Q&Aランキング