- ベストアンサー
VBAでのセルの参照
VBAであるセルの値をCSV出力にしようしたいと思っています。 対象セルが、ただ値のみが入っているセルならば問題ないのですが、式が入っているセルですと上手くできません。 詳細は以下のとおり セルA1:8.25 セルA2:8.80 セルA3:=A1-A2 (画面には-0.55と表示)で 変数=Cells(3,1).Valueと言った形で、A3の値を変数に受け取ろうとしています。 すると変数には入るべき値の近似値(-0.54999999・・) が入ります。 すべてのセルの書式は数値で、少数第2位までに設定されており、決して上記以外の値が入っていることはありません。 何故、このような現象が起こり、またどうすれば解決できるのでしょう? ちなみに変数=Cells(3,1).Textにすると正しい値(-0.55)が入ります。 .Valueと.Textの違いも教えていただけるとあり難いです。 宜しくお願いします。
- hiro_sun
- お礼率60% (214/353)
- Visual Basic
- 回答数2
- ありがとう数3
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。maruru01です。 No.1の方のとおりなのですが、1つ補足を。 >すべてのセルの書式は数値で、少数第2位までに設定されており、 >決して上記以外の値が入っていることはありません。 勘違いされているようですが、セルの書式(表示形式)は、あくまでセルの見た目を設定するもので、中の値を操作するものではありません。 したがって、例えば「0.555」という値を、表示形式で「0.56」としても、値は「0.555」のままです。 そして、Valueプロパティはセルの値そのものを取得し、Textプロパティは、現時点のセルに"表示されている"値を取得します。 つまり、表示形式を変更すると、Valueプロパティの戻り値は変わりませんが、Textプロパティの戻り値は表示形式に合わせて変わるわけです。 それから、もう1つ重要なこととして、浮動小数点誤差の問題があります。 Excelでは、小数の計算をすると、"浮動小数点誤差"を生じます。 浮動小数点誤差に関しては、以下のページを熟読して下さい。 http://pc21.nikkeibp.co.jp/special/gosa/ さて、最後に、今回のような近似値はVBAの方で、Format関数で整形することも出来ます。 Format(Cells(3, 1).Value, "0.00")
その他の回答 (1)
- gatyan
- ベストアンサー率41% (160/385)
ヘルプには明記してないようですが、返される値は .Value セルに入っている値そのもの … 数値 .Text 表示される値(セルの書式に従った) … 文字列 になるようですね。
お礼
さっそくのご回答有難うございました。
関連するQ&A
- VBA セルに入力されている数値でセルを指定する
Excel VBA初心者です。 Sheet1のA1セルに10、A2セルに3を入力しています。 この入力したセルの数値を参照して、 Sheet2の「Cells(10,3)」(C10セル)を青(Interior.ColorIndex = 5)に 書式変更したいのですが、「Cells(”Sheet1.A1の値”,”Sheet1.A2の値”)」の 書き方がわかりません。 Excel2010を使用しています。 よろしくお願いします。
- ベストアンサー
- Excel(エクセル)
- セルの交点に入力するには?
あるセルとあるセルの交点に変数に格納した値を入力したいのですが、うまくいきません。 どなたかご教授をお願いできないでしょうか。 VBAを以下にご紹介します。s,e,aの変数はStringで定義しています。Longだとemptyになるようなので・・・ .Cells(i, t).Value = Format(Now(), "yyyy/mm/dd AM/PM") s = Me.s.Value 'ユーザフォームから入力された値を格納 16桁の数値 e = .Cells(i, t).Value a = Me.a,.Value'ユーザフォームから入力された値を格納 16桁の数値 Intersect(Range("$B:$B").Find(s, Lookat:=xlWhole).EntireRow, Range("$1:$1").Find(e, Lookat:=xlWhole).EntireColumn).Value = a これで実行すると、 「実行時エラー91 オブジェクト変数、またはwithブロック変数が設定されていません。」 となってしまいます。 よろしくお願いします。
- ベストアンサー
- その他MS Office製品
- エクセルVBA 配列の書き方とセルへの一括表示方法
エクセルのVBAで 下記のようなプログラムを作成しています。 1行目はタイトル行で E列が空白になるまで、 各行のE列~H列の値を変数に入れて、 最後に一括で別の列・行にそれぞれの値を表示・書込したいと思ってますが、 どうもVBAは初めてでよくわかりません。 Dim aaa As String Dim bbb As String Dim ccc As String Dim eee As Double intRow = 2 Do Until Cells(intRow, 5).Value = "" aaa = Cells(intRow, 5).Value) bbb = Cells(intRow, 6).Value) ccc = Cells(intRow, 7).Value) ddd = Cells(intRow, 8).Value) intRow = intRow + 1 Loop aaaの各変数を2行目のA1~intRowまで bbbの各変数を2行目のB1~intRowまで cccの各変数を2行目のC1~intRowまで dddの各変数を2行目のD1~intRowまで セルに一括して表示したいのです。 配列の書き方と、セルの範囲に表示・書込する方法を どうかご教示下さい。お願いいたします。
- ベストアンサー
- Excel(エクセル)
- 0が消える:WRITEを使ってTEXT出力
ワークシートの一部をカンマ区切りのテキストとして出力しようとしています。ワークシートには文字列と数値が混在しています。文字列は"文字列"としてする必要があります。数値はそのまま出力します。 ワークシート上で文字列あらかじめ""を付加しておくと、CSV保存の際に、""文字列""となるので、CSV形式は断念しました。 そこでVBAでWRITEを使い、 Dim i, j As Integer i = 2 j = 1 For i = 2 To 5 Write #1, Worksheets("diff").Cells(i, j).Value, Worksheets("diff").Cells(i, j + 1).Value, Worksheets("diff").Cells(i, j + 2).Value, Next i Close #1 といった感じで挑戦しています。ところが、セルの値が1より小さい数値、つまり0から始まる場合には、始めの0が消えてしまいます。 セルの値 0.**** 出力された値 .**** 「それが仕様だよ」と言う場合には、何か良い方法を教えていただけると幸いです。
- ベストアンサー
- オフィス系ソフト
- VBA セルの削除
開いているブック全てに対して、セルを削除するマクロを組んだのですが、うまく動作しません。 1. ブックのsheet1にてセルB2~B100の中で、値があるセルを特定 値の入ったセルがあれば、その値と同じ名前のシートが存在する 例) B2:値 1-A、シート名: 1-A B3:値 2-A、シート名: 2-A ... 2. 特定した値と同じ名前のシートをアクティブにする 3. そのシートにて「セルA1がブランクでない かつ セルB1の値がゼロ」と条件をかける 4. trueであれば、sheet1にて特定したセルへ戻る 5. 特定したセルとその右隣のセルを削除(上シフト) 6. 1.~5.を、sheet1のセルB2以降、値がブランクになるまで繰り返す 次の通り構文を作成、エラーなく実行できるのですが、結果は5.までしか処理されず、他のブックに対しても処理が走っていません。 格納した変数に問題がありそうなのですが、解決できず困っています。 Sub test() Dim WBK As Workbook For Each WBK In Workbooks If WBK.Name <> ThisWorkbook.Name Then WBK.Activate For i = 2 To 100 touroku = WBK.Worksheets("sheet1").Cells(i, 2).Value If WBK.Worksheets("sheet1").Cells(i, 2).Value <> "" Then WBK.Worksheets(touroku).Activate If ActiveSheet.Cells(1, 1) <> "" And ActiveSheet.Cells(2, 1).Value = 0 Then WBK.Worksheets("sheet1").Cells(i, 2).Resize(1, 2).Delete End If End If Next i WBK.Save End If Next WBK End Sub まだVBA初めて1ヶ月ほどで、基礎が理解できてきた程度なのですが、急ぎ完成させたいマクロなのでお力を貸してください。 よろしくお願いいたします。
- ベストアンサー
- オフィス系ソフト
- セルの値が「#VALUE!」の場合 vba
セルの値が「#VALUE!」の場合、 VBAで If Cells(lastRow, Col_本体価格) = Empty Then とすると、 「実行時エラー 13 型が一致しません。」 となります。 セルの値が「#VALUE!」の場合でも、 VBAでifステートメントを使えるようにするには どうすればいいですか?
- ベストアンサー
- Excel(エクセル)
- 異なるブック間でのセル範囲のコピー/VBA
異なるブック間でクリップボードを経由せず直接コピーしたいため 下記のマクロを記述していますが、実行エラーが発生します。 どうしてでしょうか。 ThisWorkbook.Worksheets(3).Range(Cells(3, 1), Cells(3 + a, 1)).Value = Workbooks("excel.xls").Worksheets(1).Range(Cells(11, 3), Cells(11 + a, 3)).Value (補足) (1)VBA実行中のThisWorkbook、excel.xlsは別のブック ですが、同じフォルダにあります。 (2)aは数値が入る変数です。
- ベストアンサー
- Visual Basic
- vbaにおいて、セルのエラー検出に関して
vbaにてセルに入力する数式のエラー検出に関して教えてください。 iserror関数で検出できない数式を簡単に検出する方法ありませんか? sub test() dim str as string str=" C2*C3* " cells(5,7).value=str end sub 簡単なVBAのコードですが、*の右側はセル相対参照もセル絶対参照も数値も入っていませんので、数式としてはエラーです。 strの値を(5,7)のセルに放り込んだら、vbaのエラーで停止してしまいます。 かといって、iserror()を使って、 sub test() dim str as string str="C2*C3*" if iserror(str)=true then else cells(5,7).value=str end if end sub としても、エラーをはじいてくれず、VBAでもエラーを出力してしまいます。 力業で、strの数式エラーをはじくしか方法はないのでしょうか? インターネットを調べているのですが、的を射た答えが出てきません。 どなたか詳しい方ご教示ください。
- ベストアンサー
- その他(インターネット・Webサービス)
- エクセル2007 参照セルの値が認識されない
エクセル2007の環境で下記マクロを実行すると、 アクティブシートのセルA1に数字が入っている場合、Sheet1のセルA1に値を転記しても そのセルA1の値をVLOOKUP関数で参照できません。 マクロに問題があるためなのか何処に問題があるのか分からないので教えてください。 宜しくお願いいたします。 【sheet】は アクティブシートの3行目から1000行目までのA列のセルをクリックしたらセルA1に値を表示 その後、下記【モジュール】を使用し、 アクティブシートのセルA1が空白の場合、 A列の数値をSheet1のセルA1に転記し、アクティブシートのA列の数値が空白になるまで循環する。 Sheet1のセルA1の値をVLOOKUP関数で参照した内容を表示、印刷します。 ----------------------------------------------------------------- '【sheet】 Private Sub Worksheet_SelectionChange(ByVal Target As Range) With Target If .Count > 1 + IsEmpty(.Value) Then Exit Sub If Application.Intersect(.Cells, Range("A3:A1000")) Is Nothing Then Exit Sub ActiveSheet.Cells(1, 1).Value = .Value End With End Sub ----------------------------------------------------------------- '【モジュール】 Sub TEST() Dim myBtn As Integer Dim myMsg As String, myTitle As String Dim WS1 As Worksheet, WS2 As Worksheet Dim i As Long myMsg = "●●●" myTitle = "確 認" myBtn = MsgBox(myMsg, vbYesNo + vbExclamation, myTitle) If myBtn = vbYes Then Set WS1 = ActiveSheet Set WS2 = Sheet1 If WS1.Cells(1, 1).Value = "" Then With WS1 For i = 3 To 65536 If .Cells(i, 1).Value = "" Then Exit For WS2.Cells(1, 1).Value = .Cells(i, 1).Value WS2.Cells(1, 2).Value = ActiveSheet.Name 'WS2.PrintOut Copies:=1 Next i End With ElseIf WS1.Cells(1, 1).Value >= 1 Then WS2.Cells(1, 1).Value = WS1.Cells(1, 1).Value WS2.Cells(1, 2).Value = WS1.Name 'WS2.PrintOut Copies:=1 Else End If End If End Sub -----------------------------------------------------------------
- ベストアンサー
- その他MS Office製品
- 【VBA】条件を満たしたセルを塗り潰し
VBAで下記のようにしたいのですが、どのようにすれば良いでしょうか? A 1 100 2 110 3 120 4 130 5 140 6 150 7 160 8 170 9 180 【条件】この場合、A1:A9の範囲内でB1の値を超える値が入力されているセルを黄色で塗りつぶす ※前提として、B1に150と入力されているとします 上記のようなVBAを作成したいと思っています。 この場合、塗りつぶしの対象となるセルはA7,A8,A9となります。 条件付き書式で対応できるのですが、Excel2007で作成したファイルをExcel2003で開くと条件付き書式が反映しませんでしたので、VBAで対応しようと思いました。 宜しくお願いします。
- ベストアンサー
- オフィス系ソフト
お礼
参考URLが大変参考になりました。 有難うございました。