[PR]ネットとスマホ OCNでまとめておトク!

お世話になります。

VBでエクセルにデータを貼り付ける処理があるのですが、
エクセルの書式設定(数値で小数点第3位まで表示)が反映されず、そのままの値が文字列として表示されてしまいます。

そのセルをダブルクリックすると書式が反映されます。

貼り付ける時はパフォーマンスを考慮して、下記のように一括で貼り付
けるようにしています。
「m_xlSheet.Range("A" + CStr(lngRows) + ":U" + CStr(lngRows)).Value = strValue」
何かよい方法をご存知でしたら、教えて下さい。

環境:VB6(SP6)、エクセル2000

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

A 回答 (3件)

こんにちは。

KenKen_SP です。

> m_xlSheet.Range("A" + CStr(lngRows) + ":U" + CStr(lngRows)).Value = strValue

変数 strValue が String型配列になっているからですね。恐らく、VB の自動
キャスト機能が原因です。

オートメーションのコードを書くのは面倒なので、Excel VBA でサンプルを
書いておきます。変数の型の違いでセルへ転記がどのように違うかを確認して
下さい。

Sub Sample1()

  ' 文字列として数字が転記される例
  
  Dim Buf() As String '<-- 文字列型変数が原因
  
  ReDim Buf(1 To 5, 1 To 5)
  For i = 1 To 5
    For j = 1 To 5
      ' 数値が文字列にキャストされる
      Buf(i, j) = 12345
    Next j
  Next i
  Range("A1:E5").Value = Buf

End Sub

ではどうするかといえば、配列の型を Variant にしてしまうのが一番
簡単です。

Sub Sample2()

  ' 対応策
  
  Dim Buf() As Variant '<-- バリアント型にする
  
  ReDim Buf(1 To 5, 1 To 5)
  For i = 1 To 5
    For j = 1 To 5
      Buf(i, j) = 12345
    Next j
  Next i
  Range("A1:E5").Value = Buf

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

配列の型を Variant型にすることで、適切に書式が適用されました。
お忙しい中、ありがとうございました。

お礼日時:2006/08/24 09:02

#2 です。

もう少しサンプルを提示しておきます。

Sub Sample3()

  Dim i As Long
  Dim j As Long
  
  'Dim Buf() As Variant '<-- バリアント型にする
  'または数値しか代入されないなら Double 型等でも OK
  Dim Buf() As Double
    
  ReDim Buf(1 To 5, 1 To 5)
  For i = 1 To 5
    For j = 1 To 5
      Buf(i, j) = 1.333
    Next j
  Next i
  With Range("A1:E5")
    .NumberFormat = "0.000"
    .Value = Buf
  End With

End Sub

Sub Sample4()

  Dim strTmp As String
    
  ' VB では数値が String 型にキャストされて代入される
  ' strTmp = Cstr(1.333) と同意. つまりこの段階では、
  ' strTmp = "1.333" となっている
  strTmp = 1.333
  ' しかし、配列でない「通常変数の場合」はセルへの代入時に
  ' Excel が「型の判断を再度行う」ため、再び数値として評価
  ' できるものは数値となってしまう....
  Range("A1").Value = strTmp
  
  ' 配列の一括転記時にはこの機能が働かない
  
End Sub
    • good
    • 0
この回答へのお礼

回答して頂きありがとうございます。
なるほど、配列の一括転記時はExcelで自動変換されないんですね。
いろいろ試してみます。

お礼日時:2006/08/24 09:04

私の環境(2003)ではできるんですが。


例えば、strValueが1.333ならセルに1.333と表示されれば問題ないわけですよね。
ツールー>オプションー>設定の編集等でなにか特別な設定を行っていないか確認されは同でしょうか。
最終手段は新たしいブックを作成し、そちらに、必要なワークシートの内容をコピー貼り付け、マクロもコピー貼り付けしてみたらどうでしょう。
まあバージョンが異なるのでなんともいえないですが。ご参考になれば幸いです。

この回答への補足

「ツールー>オプションー ・・・」はデフォルトのままで、特にいじっておりません。

また、新しいブックに形式を選択して貼り付けで、値のみにしても同じように表示されてしまいます。

補足日時:2006/08/23 19:13
    • good
    • 0

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

QExcel:表示形式の変更がただちに反映されない…!?

WinXP,Excel2002です。

業務アプリから出力したExcelのファイルのみで起きている現象なのですが、
データの書式を「ユーザ定義」で設定しても、
なぜか、その場で反映されません。
一度セルをダブルクリックしたのちにフォーカスをはずすと、
なぜか そこでパッと反映されます。

値は「2006-07-01 12:02:17」といったもの。
「ddd」と設定した時点で表示は「Sat」になるはずなのに、
1セルずつ ぷちぷちダブルクリックしないと変わってくれません…。

同僚に聞くと「外部ソフトから落としたためで、手の打ちようがない」とのことですが、
どうにかこのブックを使って表示形式を変えることはできないでしょうか?
お願いします!

Aベストアンサー

こんにちは。KenKen_SP です。

文字列データとなっているとか? 特に日付部分が日本の標準的な

 yy/mm/dd

ではなく、”-”で区切られてますし。OS や Excel のバージョンによっては、
コントロールパネルの日付書式の設定いかんで文字列として扱われる可能性は
ありますよね。

 # Excel 2002 VBA で 配列にいれた日付をセルに転記すると英語書式の
 # 文字列になるバグがありました。SP2 か SP3 で修正されましたが。
 # 独自プログラム(VBA含む)でセルにデータを書き込む場合は、この
 # ように、Excel本体の動作とは違う結果になる場合が稀にあります。

適当なセルに 1 を入力してコピーし、セルを選択して形式を選択して貼り付け
「乗算」で、シリアル値に直せると思います。Excel が文字列として認識して
いるなら「日付・時刻」の表示形式を設定しただけでは表示は更新されません。

ダブルクリックで表示形式が有効になるのは...

セルの表示形式が「標準」であれば、セルをダブルクリックで編集モードに入り、
再度確定させると値の更新があったものとして、再計算がなされます。このとき
Excel は値をみて、日付・時刻と自動的に認識し、設定された「日付・時刻」の
ユーザー定義書式を適用するのだと思います。

こんにちは。KenKen_SP です。

文字列データとなっているとか? 特に日付部分が日本の標準的な

 yy/mm/dd

ではなく、”-”で区切られてますし。OS や Excel のバージョンによっては、
コントロールパネルの日付書式の設定いかんで文字列として扱われる可能性は
ありますよね。

 # Excel 2002 VBA で 配列にいれた日付をセルに転記すると英語書式の
 # 文字列になるバグがありました。SP2 か SP3 で修正されましたが。
 # 独自プログラム(VBA含む)でセルにデータを書き込む場合は、この
 #...続きを読む

QExcelVBAでデータを一括してセルに貼り付ける

こんばんは

ExcelVBAで教えてください。
配列のデータをセルに貼り付ける方法です。
一つ一つ行う方法は解ります。
しかし、これでは件数が多いと時間がかかってしまいます。
まとめて貼り付ける方法を教えてください。
例えば次のように100列1000行のデータのとき、一つ一つでは10万回も貼り付けることになります。
これを1行単位で1000回とか全部まとめて1回とかでできないでしょうか。
配列データを用意する都合で1行単位もお願いします。


For Row = 1 To 1000
For Column = 1 To 100
Cells(Row, Column).Value = 配列(Row - 1, Column - 1)
Next
Next

Aベストアンサー

http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_070_08.html
を参考にしてください。

Qexcelで書式の変更が反映されない

 excel2000です。ある列に数値で入力した「20010401」のようなデータが200くらいあり、その列全体の書式を文字列に変更し、並べ替えを行うと、その書式の変更が反映されていないところがあり、うまくいきません。
 書式が反映されていないセルをダブルクリックすると反映するのですが、、、
 書式の変更が反映されないセルはいつも決まっているようです。
 何か対処方法はあるでしょうか。一応ファイルサイズとしては、500kbiteくらいのものです。

Aベストアンサー

こんにちは!

>その列全体の書式を文字列に変更し
元々数値が入っているセルの表示形式を文字列にしても
文字になりません!
(見た目が文字列なだけで実は数値です。)

一括で完全な文字列にするには
・その列を選択
・データ 区切り位置 次へ 次へ 表示形式[文字列]をチェック 完了
で変換できると思います。試してみて下さい!

ついでに
元々文字列で入力されている数"字" を 数値 に変換するには
・書式設定を標準や数値にした後
・データ 区切り位置 完了

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
の方ですかね。

Qエクセル セルの書式設定を選択したすべてのセルに適用する方法

エクセルの「セルの書式設定」ですが、だいたいのことは複数セルを選択すると、複数セルに適用されるのですが、「セルの書式設定」をしたあとに該当のセルをいちいちダブルクリックしなくては適用されずに困っています。

これは、テキストウィザードで「文字列」として取り込んだ「2008/12/15」などの日付でおこりました。
列をいっせいに「EMMDD」(201215)の形に変更したくて、セルの書式設定をしましたが、見た目が変わらず、ユーザー定義を使う前にいったん「数値」や「標準」「日付」にしてから、とも思ってやってみたのですが、見た目が変わりません。
どれも、その列の該当のセルをダブルクリックしてアクティブにしないと適用されないみたいです。
複数セルを選択して一気にできる方法はありませんか?
よろしくお願いします。

Aベストアンサー

文字列では日付書式の設定はできません。
文字列を数値に変換しなければなりません。
1.どこかのセルに「1」をいれて、これをコピーする。
2.文字列→数値にしたいセル範囲を選択して、「形式を選択して貼り付け」で、「乗算」をクリックする。
これで、文字列→数値になります。

ある書式に設定されたセルの書式を、他の選択範囲に適用する方法。
刷毛の形をした「書式のコピー/貼り付け」のボタンわかりますか。
なければ、
ツール―ユーザー設定―コマンド―書式の右のボックスを探してツールバーに表示する。
ある書式に設定されたセルを選択して、「書式のコピー/貼り付け」ボタンをダブルクリックする。
その書式を設定したい範囲を選択すれば、選択範囲がその書式になる。
「書式のコピー/貼り付け」ボタンをクリックして書式の貼り付けを解除する。
シングルクリックは1回だけ書式コピーができる。
ダブルクリックは解除するまでコピーができる。

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
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 VBAで全選択範囲の解除

EXCEL VBAで
Cells.Select
と書くと、全セルが選択状態になりますが、
これを解除するには、どう書けばよいのでしょうか?

Aベストアンサー

その1
A1 など、適当なセルを選択する。
(回答#1と同じ)

その2
全選択する前の選択範囲に戻る。

全選択前に
変数 = Selection.Address で記憶

全選択後
Range(変数).Select で元の選択範囲を選択

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...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング