ついに夏本番!さぁ、家族でキャンプに行くぞ! >>

エクセルで簡単な計算書を作成しています。(マクロ初心者)
ちなみにこのコードは自分で作成したものではなく、人から聞いていじってみました。

Private Sub Worksheet_Change(ByVal Target As Range)
'一度に複数セルの値が変更された場合は終了
'(A5:C5を選択しDeleteも含みます。)
If Target.Count > 1 Then Exit Sub
If Intersect(Target, Me.Range("H170:K170", "H171:K171","C76")) Is Nothing Then Exit Sub

Application.EnableEvents = False
'数値かつ空白以外の場合
If IsNumeric(Target.Value) And Target.Value <> "" Then
Me.Range("M170").Formula = "=if(iserror(H170*I170*J170*K170),""-"",H170*I170*J170*K170)"
'空白の場合
ElseIf Target.Value = "" Then
Me.Range("H170:K170,M170").Value = "-"
End If
Application.EnableEvents = True


Application.EnableEvents = False
'数値かつ空白以外の場合
If IsNumeric(Target.Value) And Target.Value <> "" Then
Me.Range("M171").Formula = "=if(iserror(H171*I171*J171*K171),""-"",H171*I171*J171*K171)"
'空白の場合
ElseIf Target.Value = "" Then
Me.Range("H171:K171,M171").Value = "-"
End If
Application.EnableEvents = True


Application.EnableEvents = False
'空白の場合
If Target.Value = "" Then
Me.Range("D76:K76","C76").Value = "-"
End If
Application.EnableEvents = True

End Sub

H170、I170、J170、K170のどれかに数値の入力があった場合、M170に計算式を入力。
H170、I170、J170、K170のどれかの値をDELETEキーでクリアした場合、H170、I170、J170、K170、M170に"-"を入力。

その他に似たような処理がたくさん出てくるので、H171の処理とC76をDELETEキーでクリアした場合の処理を自分で考えて作ってみたのですが、うまく実行されません。H171~の処理はうまくいったので単純にコードをどんどん追加していけば動くと思ったんですが、いろいろ調べてもどうも方法がわからず進みません・・・
解決してもらえるでしょうか・・

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

A 回答 (2件)

こんにちは。



私としては、#1の補足の内容は、あまり理解できていません。

>C76をDeleteした場合、D76:K76, C76に"-"を入力し、値が入力された場合はなにもしないというような処理をしたいです。
Me.Range("D76:K76", "C76").Value = "-" というのは、   Range("C76:K76").Value = " -" という意味だと思います。

>If Intersect(Target, Me.Range("H170:K170", "H171:K171","C76"))
これ自体も、そのままで理解したら、
If Intersect(Target, Range("C79::K171"))
ということだと思います。しかし、どうも違うような気がします。
本来は、ここら辺自体も説明が必要なのです。

もし、エリアが複数に分かれるなら、Range("H170:K170, H171:K171 ,C76") ということです。
もう、ここらは基本的なことですから、あまり細々教えることでもないとは思いますが。

私は、掲示板では、依頼に応じて、何度も作り直すということは、私はしていないのですが、これを見れば分かっていただけると思います。

--------------------------------------------

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim i As Long
  Dim j As Long
  If Target.Count > 1 Then Exit Sub
  
  If Intersect(Target, Range("H170:K180, C76")) Is Nothing Then Exit Sub
  i = Target.Row: j = Target.Column '行と列数を取得
  Application.EnableEvents = False
  
  If IsNumeric(Target.Value) And Target.Value <> "" And j > 7 Then
    Cells(i, 13).FormulaLocal = _
    "=IF(ISERROR(RC[-5]*RC[-4]*RC[-3]*RC[-2]),"" -"",RC[-5]*RC[-4]*RC[-3]*RC[-2])"
    '空白の場合
  ElseIf Target.Value = "" And j > 7 Then
    Cells(i, 8).Resize(, 4).Value = " -" 'H:K
    Cells(i, 13).Value = " -" 'M
  ElseIf Target.Value = "" And j < 8 Then
    Range("C76:K76").Value = " -"
  End If
  Application.EnableEvents = True
  
End Sub
  

>これを実行すると、"引数の数が一致していません。または不正なプロパティを指定しています。

理由は分かりませんが、別のシートでも、新しいブックでもよいので、貼り付けて試してみてください。
    • good
    • 0
この回答へのお礼

ありがとうございます。
思ったとおりに動作しています。

基本が理解できていないまま質問してすみませんでした。
この文も調べて理解を深めようと思います。
色々とありがとうございました!

お礼日時:2009/05/14 17:29

こんにちは。



マクロの修正自体は、
If Intersect(Target, Me.Range("H170:K170", "H171:K171","C76")) Is Nothing Then Exit Sub
    ↓
If Intersect(Target, Range("H170:K170,H171:K171, C76")) Is Nothing Then Exit Sub

後は、内容が確認できない部分があるので、書けません。(Me キーワードは、シート間をまたぐことはないので、特に必要はないです)

>'(A5:C5を選択しDeleteも含みます。)

>Range("D76:K76, C76").Value = " - "

この部分が良く分かりません。C76 に数値を入力したら、D76;K76 までを、どうするのでしょうか。

それと、ひとつのセルに Delete を行うと「-」が全部に入ってしまうのは、ちょっと過激なような気がします。数式で既にエラー処理されているのですから、数式まで削除して、「-」を入れてしまうのでしょうか?

この回答への補足

>'(A5:C5を選択しDeleteも含みます。)
すみません無視してください。

>Range("D76:K76, C76").Value = " - "
>この部分が良く分かりません。C76 に数値を入力したら、D76;K76 までを、どうするのでしょうか。

C76をDeleteした場合、D76:K76, C76に"-"を入力し、値が入力された場合はなにもしないというような処理をしたいです。

>それと、ひとつのセルに Delete を行うと「-」が全部に入ってしまうのは、ちょっと過激なような気がします。数式で既にエラー処理されているのですから、数式まで削除して、「-」を入れてしまうのでしょうか?

数式が入力されているセルに直接数値を入力する場合もあり、数式が入っている上から直接値を入力するのはあまりしたくないんです。(数式がマクロで挿入されるので問題は無いんですが、見た目上として)

複数の人間が使う事を想定してまして、直接値を入力できるセルには"-"がデフォで入力してあるのが理想なんです。

さらにすみませんが補足です。
これを実行すると、"引数の数が一致していません。または不正なプロパティを指定しています。"とでて、If Intersect(Target,Range ←ここのRangeが反転します。

これって引数は2つまでしか指定できないってことですよね?
changeイベントを複数回実行できるように組まないといけないってことはわかって試行錯誤しているんですがどうもうまくいきません・・・

補足日時:2009/05/14 13:55
    • good
    • 0

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

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

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

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

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

Qエクセル:Worksheet_Changeのエラー回避

A列のセルに数字(数字かどうかの判断は無くて良い)が入ったらその隣のセルを青で塗りつぶす、
といったマクロを組んでいます。

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 1 Then
Target.Offset(0, 1).Interior.ColorIndex = 5
End if

End sub

以上をシートに直接(←呼び方がわかりません。「標準モジュール」ではない所)書込んだら動作しました。
このコードだと、行を削除した時に、
「アプリケーション定義またはオブジェクト定義のエラーです」というエラーで止まってしまいます。
A列のセルに変更があったけど塗るセルが無いから、とかそれっぽい理由は思いつくのですが、
どのように書けばエラーを回避(セルが無い場合は***、みたいな記述でしょうか)できるでしょうか。
なるべく
On Error Resume Next
は使いたくないです。
(勝手な印象ですが、なんかエラーを無視してるみたいで落ち着かない…)

A列のセルに数字(数字かどうかの判断は無くて良い)が入ったらその隣のセルを青で塗りつぶす、
といったマクロを組んでいます。

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 1 Then
Target.Offset(0, 1).Interior.ColorIndex = 5
End if

End sub

以上をシートに直接(←呼び方がわかりません。「標準モジュール」ではない所)書込んだら動作しました。
このコードだと、行を削除した時に、
「アプリケーション定義またはオブジェクト定義のエラーです...続きを読む

Aベストアンサー

> 「アプリケーション定義またはオブジェクト定義のエラーです」という
> エラーで止まってしまいます。

行全体を削除すると、Target は行全体になりますよね。Excel2003 まで
なら 256列分全てです。

その Target を Offset でひとつ横にずらそうとしても、257列目は
存在しないので、エラーになります。

このような場合は、Intersect メソッドを使います。

Private Sub Worksheet_Change(ByVal Target As Range)
  
  Dim rTmp As Range
  Dim r  As Range
  
  ' // Target と A列 で重なる部分(Range)を Intersect メソッドで
  ' // 参照してみます
  Set rTmp = Intersect(Target, Columns("A"))
  If Not rTmp Is Nothing Then
    ' // 参照できる部分があった場合
    Application.ScreenUpdating = False
    ' // 複数セルに対応するためには、「セル単位」または「セルの選択
    ' // ブロック単位」でループ処理させる必要があります
    ' // 今回は Areas を使って「セルの選択ブロック単位」で処理します
    For Each r In rTmp.Areas
      r.Offset(0, 1).Interior.ColorIndex = 5
    Next
    ' // オブジェクト変数は使い終わったらクリアします
    Set rTmp = Nothing
  End If

End Sub

以下は余談です。

> 勝手な印象ですが、なんかエラーを無視してるみたいで落ち着かない…

それで良いと思います。ロジックで対応できるものを安易に On Error
Resume Next していては、エラーをコントロールするプログラム力が
身につきません。On Error Resume Next は「使わざるを得ない」と思う
場所以外では使うべきではありません。私見でした。

> 「アプリケーション定義またはオブジェクト定義のエラーです」という
> エラーで止まってしまいます。

行全体を削除すると、Target は行全体になりますよね。Excel2003 まで
なら 256列分全てです。

その Target を Offset でひとつ横にずらそうとしても、257列目は
存在しないので、エラーになります。

このような場合は、Intersect メソッドを使います。

Private Sub Worksheet_Change(ByVal Target As Range)
  
  Dim rTmp As Range
  Dim r  As Range
  
  ' // Target と...続きを読む

Qセルの値が変ると自動でマクロが実行される。

セルの値が変ると自動でマクロが実行されるVBAを教えて下さいm(_ _ )m
例えば、シート1のA1の値が変ると、マクロAが実行される。
シート1のA2の値が変ると、マクロBが実行される。
と一つのシート内に複数のイベントを設置したのですが、イマイチわかりません。
知恵をお貸し下さい。

Aベストアンサー

こんにちは
お邪魔します。

(1)まずはオーダー通りの基本型

Private Sub Worksheet_Change(ByVal Target As Range)
' ' 複数セルが変更された場合(単セルでない場合)は処理を抜ける
If Target.Count > 1 Then Exit Sub
' ' 変更されたセルが1列めでない場合は処理を抜ける
If Target.Column <> 1 Then Exit Sub
' ' 変更されたセルの行位置によって処理を分岐する
Select Case Target.Row
Case 1
' A1 の場合の処理
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
Case 2
' A2 の場合の処理
MsgBox "A2" ' 確認用(確認が済んだら当行削除)
End Select
End Sub

(2)セルの位置によってもっと細かく分岐したい場合

Private Sub Worksheet_Change(ByVal Target As Range)
' ' 複数セルが変更された場合(単セルでない場合)は処理を抜ける
If Target.Count > 1 Then Exit Sub
' ' 変更されたセルの 列位置 によって処理を分岐する
Select Case Target.Column
Case 1 ' 1列めなら
' ' 変更されたセルの 行位置 によって処理を分岐する
Select Case Target.Row
Case 1 ' 1列め の 1行め なら
' A1 の場合の処理
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
Case 2 ' 1列め の 2行め なら
' A2 の場合の処理
MsgBox "A2" ' 確認用(確認が済んだら当行削除)
End Select
Case 2 ' 2列めなら
' ' 変更されたセルの 行位置 によって処理を分岐する
Select Case Target.Row
Case 1 ' 2列め の 1行め なら
' B1 の場合の処理
MsgBox "B1" ' 確認用(確認が済んだら当行削除)
Case 2 ' 2列め の 2行め なら
' B2 の場合の処理
MsgBox "B2" ' 確認用(確認が済んだら当行削除)
End Select
End Select
End Sub

(3)セルのアドレスを採り文字列で分岐したい場合
   (個人的にはあまりお奨めしていませんが、知っておいた方が好いもの)

Private Sub Worksheet_Change(ByVal Target As Range)
'' ' 変更されたセルの 参照文字列(A1型) によって処理を分岐する
Select Case Target.Address(False, False)
Case "A1"
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
Case "A2"
MsgBox "A2" ' 確認用(確認が済んだら当行削除)
Case "B1"
MsgBox "B1" ' 確認用(確認が済んだら当行削除)
Case "B2"
MsgBox "B2" ' 確認用(確認が済んだら当行削除)
End Select
End Sub

とりあえず、単セルの場合だけ、理解を深めてみましょう。
複数セルに値変更があった場合については、その後でいいと思います。
(1)にある
If Target.Count > 1 Then Exit Sub
If Target.Column <> 1 Then Exit Sub
のような記述はイベントプロシージャでは多用される基本中の基本ですから
よーく咀嚼して呑み込んじゃってください。

一応、いわずもがなですが、
上に挙げたようなイベントプロシージャを複数併記することはできませんので
使わないものはコメントブロックして下さい。
VBE(Visual Basic Editor)のツールバーに[編集]というのを追加してあれば
[コメントブロック]、[非コメントブロック]というボタンがありますので適宜。

また、イベントプロシージャで注意するべき点として
例えば今回のChangeイベントの処理中にセルの値を変更すれば
再度Changeイベントが呼び出される(再帰)ということを知っておいてください。
その場合、
  Application.EnableEvents = False
  ' 処理
  Application.EnableEvents = True
のような形で、再帰を回避します。

私自身VBAを覚え初めの頃は、イベントプロシージャとばかり格闘して
日に何百回もエラーを出しながら納得がいくまで色んなことを試していた覚えがあります。
・オブジェクトやプロパティの基本的な扱い方
・条件分岐
などの基本事項を覚えるのには最適の課題ですから、頑張って挑戦し続けてください。

以上です。

///
Re:#2 ちょっと違うかも。
それは、「A1 と 同じ値 に変更された セル があった場合」の処理になっています。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target = Range("A1") Then
MsgBox Target.Address
End If
End Sub
として、例えば、C3セルにA1と同じ値を設定すると違うのがわかると思います。
あしからず、、、

こんにちは
お邪魔します。

(1)まずはオーダー通りの基本型

Private Sub Worksheet_Change(ByVal Target As Range)
' ' 複数セルが変更された場合(単セルでない場合)は処理を抜ける
If Target.Count > 1 Then Exit Sub
' ' 変更されたセルが1列めでない場合は処理を抜ける
If Target.Column <> 1 Then Exit Sub
' ' 変更されたセルの行位置によって処理を分岐する
Select Case Target.Row
Case 1
' A1 の場合の処理
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
...続きを読む

QExcel VBAでのWorksheet_Changeが動作しない原因

VBA初心者です。
エクセル上で特定のセル(A1~C3の6セル)が変更された際に、マクロが自動で動作するようにしたいと考えています。

既に単独では動作確認済のtest()マクロを作り、
さらに以下のイベントプロシージャを記述したのですが、セルの変更に対して反応が起きません。
どの部分に問題があるかご教示願えますでしょうか。

※test()マクロに関してはA1~C3のセルは参照するものの、
これらのセルを書き換える事はない為、ループは起きない可能性もありますが、
念の為Application.EnableEvents = Falseを入れてあります。

Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, Range("A1:C3")) Is Nothing Then
Exit Sub
Else
Application.EnableEvents = False
Call test
Application.EnableEvents = True
End If
End Sub

VBA初心者です。
エクセル上で特定のセル(A1~C3の6セル)が変更された際に、マクロが自動で動作するようにしたいと考えています。

既に単独では動作確認済のtest()マクロを作り、
さらに以下のイベントプロシージャを記述したのですが、セルの変更に対して反応が起きません。
どの部分に問題があるかご教示願えますでしょうか。

※test()マクロに関してはA1~C3のセルは参照するものの、
これらのセルを書き換える事はない為、ループは起きない可能性もありますが、
念の為Application.EnableEvents = ...続きを読む

Aベストアンサー

こんにちは。

>どの部分に問題があるかご教示願えますでしょうか。

サブルーチンに肝心な部分を書いておいて、動きませんといっても、それは誰も分からないと思います。

それよりも、むしろ、ご自分で出来るように、デバッグの方法を身につけることですね。
イベント・ドリブン型の最初の部分に[ブレークポイント]を置き、
次に、「Test」というプロシージャが、どこかに置かれていたら、そこに、[ブレークポイント]を置きます。

イベントを発生させたら、[F8]で、ステップモードでひとつずつ動かします。そしてマクロが、正しく動いているかチェックします。そして、そのマクロが、再び、戻ってくるかどうか、様子をみます。
ただし、今回のマクロは途中で止めると、Application.EnableEvents = True に戻っていないことがありますから、イミディエイトウィンドウあたりで、設定を戻したほうがよいです。

また、初心者ならでは失敗は、Test プロシージャが、標準モジュールか、そのシートモジュールのどちらかに置いていないのが原因だったりします。

こんにちは。

>どの部分に問題があるかご教示願えますでしょうか。

サブルーチンに肝心な部分を書いておいて、動きませんといっても、それは誰も分からないと思います。

それよりも、むしろ、ご自分で出来るように、デバッグの方法を身につけることですね。
イベント・ドリブン型の最初の部分に[ブレークポイント]を置き、
次に、「Test」というプロシージャが、どこかに置かれていたら、そこに、[ブレークポイント]を置きます。

イベントを発生させたら、[F8]で、ステップモードでひとつずつ動かし...続きを読む

QエクセルVBAのDeleteキーによるエラー

VBA初心者です。エクセル(2003)のVBAについて質問です。

セルに何か値が入力されたら、隣のセルに「TRUE」と入力し、
入力が消去されたら、隣のセルに「FALSE]と入力されるマクロを作成しています。

下記のコードをシートモジュールに入力し、
標準モジュールにはそれぞれ呼び出し用のマクロを入力しています。
A列とB列は結合されていて、その結合されたA・B列のセルに値が入力されたり消去されたりすると
隣のC列に結果が入力されるようにしたいのですが、
A・B列の値をDeleteキーで消去するとエラーになってしまいます。
BSキーで値を消去するとエラーは出ません。
Deleteキーでもエラーが出ない様にする方法はありますでしょうか。
どなたかご教授お願いします。

-----------------------------------------------------

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1:B1,A3:B3,A5:B5")) Is Nothing Then
If Target.Value <> "" Then
Select Case Target.Address(0, 0)
Case "A1"
Call マクロ1_TRUE
Case "A3"
Call マクロ3_TRUE
Case "A5"
Call マクロ5_TRUE
End Select
ElseIf Target.Value = "" Then
Select Case Target.Address(0, 0)
Case "A1"
Call マクロ1_FALSE
Case "A3"
Call マクロ3_FALSE
Case "A5"
Call マクロ5_FALSE
End Select
End If
End If
End Sub

VBA初心者です。エクセル(2003)のVBAについて質問です。

セルに何か値が入力されたら、隣のセルに「TRUE」と入力し、
入力が消去されたら、隣のセルに「FALSE]と入力されるマクロを作成しています。

下記のコードをシートモジュールに入力し、
標準モジュールにはそれぞれ呼び出し用のマクロを入力しています。
A列とB列は結合されていて、その結合されたA・B列のセルに値が入力されたり消去されたりすると
隣のC列に結果が入力されるようにしたいのですが、
A・B列の値をDeleteキーで消去するとエラーになって...続きを読む

Aベストアンサー

こんにちわ

Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox Target.Address(0, 0)
If Intersect(Target.Cells(1), Range("A1:B1,A3:B3,A5:B5")) Is Nothing Then Exit Sub
If Target.Cells(1).Value <> "" Then
・・・
・・・

上の例のように、MsgBox Target.Address(0, 0)を加えて、
DeleteキーとBSキーでの動作の違いを見てください。

そして、次のようにすべて書き換えてください。
Target → Target.Cells(1)

Qエクセル イベントマクロ Changeイベントを複数作りたい

Private Sub Worksheet_Change(ByVal Target As Range)
  If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub

以下マクロの内容

End Sub

これでセルA1が変わるとイベントマクロが発生しますが
セルB1が変わると別のマクロが発生し
セルC1が変わるとまた別のマクロが発生し…とするには
どうすればよいのですか
単純に並べて書いたらだめみたいだったんですけど

Aベストアンサー

Private Sub Worksheet_Change(ByVal Target As Range)
Select Case Target.Address
Case "$A$1"
 A1のマクロ文
Case "$B$1"
 B1のマクロ文
Case "$C$1"
 C1のマクロ文
・・・・
End Select
End Sub
こんな感じでは?

QEnterキーでマクロを起動さす。

Excelの(例)A1のセルに検索値を入力しEnterキーを押すと事前に組まれたマクロが起動する方法を教えて下さい。

又はEnterキーにマクロは設定できませんか?

Aベストアンサー

#4のnojioさんの補足ということでお読みください。(書いているうちにかぶってしまいました。)

Worksheet_Changeがsumi-hamaさんの意図かもしれませんが・・・下記はEnterに対して機能します。


下記コードを標準モジュールに貼り付け、
 Onkey_Set を実行することでEnterキーにマクロが割り当てられます。
 マクロ側で(MacroTest)Sheet1のA1を特定しています。

 Onkey_Off を実行することでEnterキーは元の機能に戻ります。


'Enterキーにマクロを割り当て
Sub Onkey_Set()
  Application.OnKey "{Enter}", "MacroTest"
End Sub

'デモ(Sheet1のセルA1のみで機能させる)
Sub MacroTest()
  If ActiveSheet.Name = "Sheet1" Then
    If ActiveCell.Address(0, 0) = "A1" Then
      MsgBox "Sheet1のセルA1でEnterキーを押しました"
    End If
  End If
End Sub

'Enterキーを元の機能に戻す
Sub Onkey_Off()
  Application.OnKey "{Enter}"
End Sub

#4のnojioさんの補足ということでお読みください。(書いているうちにかぶってしまいました。)

Worksheet_Changeがsumi-hamaさんの意図かもしれませんが・・・下記はEnterに対して機能します。


下記コードを標準モジュールに貼り付け、
 Onkey_Set を実行することでEnterキーにマクロが割り当てられます。
 マクロ側で(MacroTest)Sheet1のA1を特定しています。

 Onkey_Off を実行することでEnterキーは元の機能に戻ります。


'Enterキーにマクロを割り当て
Sub Onkey_Set()
  Applic...続きを読む

QExcel VBAで同じフォルダ内のファイルを開くには?

Windows2000、Excel2000を使用しています。

「経理」というフォルダに「見積」「請求」の2つのExcelファイルがあります。
「見積」から「請求」を開くマクロを作りたいのですが、どうすればいいでしょうか?
「経理」フォルダは場所が変わることがあるので、パスをどうすれば良いかがわからず苦しんでいます。
VBAはまったくの素人で、本を見ながら挑戦しているのですがうまくできないのです。

どうかよろしくお願いします。

Aベストアンサー

必ず「経理」というフォルダに「見積」「請求」の2つのExcelファイルがあると仮定。

以下ならどうでしょう?

フォルダごと移動されても上記のお約束があれば大丈夫と思います。
以下の記述は「見積」に記述してください。



Sub BookOpen()
Workbooks.Open Filename:=ThisWorkbook.Path & "\請求.xls"
End Sub

QエクセルのIF文で「NOT=」はどう書くのですか?また、>=や<=の場合の書き方を教えてください

タイトルのとおりです

IF文で下記の3つの書き方がわかりません。

NOT=は、<>?
0以外の場合は、A1<>0?

A1が0と同じか、大きい場合は
A1>=0?

なんだか、うまくいきません^^;

よろしくお願いいたします

Aベストアンサー

A1が・・・・・
A1 <> 0  0以外
A1 >= 0  0以上(0を含む)
A1 > 0   0より大きい(0は含まない)
A1 <= 0  0以下(0を含む)
A1 < 0  0未満
A1 = 0  0

=<,=> などの書き方は使えません。

Qエクセルへのデータの貼付時に書式が反映されない!

お世話になります。

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

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

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

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

Aベストアンサー

こんにちは。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

こんにちは。KenKen_SP です。

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

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

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

Sub Sample1()

  ' 文字列として数字が転記される例
  
  Dim Buf() As String '<-- 文字列型変数が原因
...続きを読む

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)
で切り上げです。

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


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

人気Q&Aランキング