出産前後の痔にはご注意!

先人のVB6.0プログラムを解読する作業中に以下の2行目の#の意味がわかりませんでした。
(0以下であればというif文の中に 1以下であればというif文?)
御教示いただければ幸いです。

if kakudo < 0 then
if kakudo <= 1# then
kai = 180 + kakudo
else
kai = 180
end if
else
kai = 0
end if

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

A 回答 (5件)

またまた登場、onlyromです。


 
>duble型と宣言しているのに、また#付きとは。
>この場合は#なくても同じということに・・・?

そうです、#はなくてもいいです。
先の回答の
Const K As Double = 5000#   '#はあっても無くてもいい
と同じことです。


要するに
■値を代入するだけ■なら、#はあってもなくてもいいわけですが、
先の回答の例のように計算に使ってる場合は、
#があるないかが重要になってくるわけです。

また、定数をそのまま使う場合は、
定数に#を付けることで宣言部分を見なくても
左辺の変数の型がDouble型というのが分かるというメリットはあるわけですが。。
 
ただ、これも変数の付け方を定石どおりやれば
変数の型もその変数名を見れば一目で分かります。
先の回答のように、
整数だったら、integerの頭3桁を取り、intData
倍精度だったら、doubleですから、dblData
とすれば変数名を見ただけで変数の型は分かりますよね。
 
ちょとだらだらとした回答になりました。(^^;;;
 
    • good
    • 0
この回答へのお礼

少し時間が開いてしまいました。

なるほどです。。
私が見ているソースはまさに計算で使用されていますので、
また少し考えます。

それにしても質問の本文に書きましたが、
'_____________________________________
if kakudo < 0 then
  if kakudo <= 1# then
    kai = 180 + kakudo
  else
    kai = 180
  end if
else
 kai = 0
end if
'_____________________________________
これの式はメチャメチャですが、if文の条件はそのままなのです。
一つ目のif文だけで2つ目のif文はいらないような気がしてしまいます・・・
#が付く事で何かif文の条件が変わるのかと思っていましたが・・・

難しいですね・・・

お礼日時:2009/04/21 19:43

またまたまた登場、onlyromです。


 
当方の回答は、そのコードが正しい云々とは関係なく、
質問のタイトルにある、「条件文にある#の意味」その一点についてです。
コードの正誤は質問者の担当?ということで敢えてそこには言及しませんでした。。。(^^;;;

では質問のコードについて。
仰るように間違ったコードですね。
実際は次のようなことだと推測されます。

一行目の
if kakudo ■< 0■ then
この、<0 は、 >0 のタイプミス(よく言えば)でしょう。


'-------------------------------------------------- 
If kakudo > 0 then
  If kakudo <= 1 then
    kai = 180 + kakudo
  Else
    kai = 180
  End If
Else
  kai = 0
End if
'----------------------------------------------

kakudoが
■0より大きくて1以下■0<kakudo<=1
・・・・kaiに、kakudo+180を代入
■1より大■1<kakudo
・・・・kaiに、180を代入
■0以下■kakudo<=0
・・・・kaiに、0を代入

尚、IF文でも、#はあってもなくても可です。

それにしても
>#が付く事で何かif文の条件が変わるのかと思っていましたが

ここが質問の要点だとは想像もしませんでした。
道理でどうも論点がずれているような、
しっくりこないような気がしてたのですが、
それが原因だったのですねぃ。(^^;;;
 
    • good
    • 1
この回答へのお礼

最後の方は私の仕事も絡んでしまいました・・
申し訳ないです。

それにしてもこれだけ親切にご教示いただいたので、
だんだんと解明できそうな気がしてきました。

長々とお付き合い頂きありがとうございました。

またすぐに壁に当たるかもですが・・・

お礼日時:2009/04/21 21:49

回答2、onlyromです。


回答1さんがお忙しいようなので。。。

>ここで使用している1はdouble型ですよという意味?

そうです。

なぜ、定数に#などつけるかというと
次の例を試してみればはっきり理解できるはずです。

'-------------------------------------
Private Sub Command1_Click()
  Dim intData As Integer
  Dim dblData As Double

  intData = 30000
  dblData = intData + 5000
  MsgBox dblData
End Sub
'-------------------------------------

上記では定数5000に、#が付いてないので
dblData = intData + 5000
ここで、オーバーフローのエラーになります。
なぜなら、intDataも5000も整数ですから
計算結果35000は整数の上限32767を超えるからです
で、それを避けるために5000に#を付けDoubleにすると
計算結果はDobuleの範囲内ということで上手くいくわけです。
 
ただ、コード内に定数を直接使うことはあまりないと思われます。
上記のようなことに常に注意しないといけないからです。
で、どうするかというと

'-------------------------------------------
Private Sub Command1_Click()
  Dim intData As Integer
  Dim dblData As Double

  Const K As Double = 5000#   '#はあっても無くてもいい

  intData = 30000
  dblData = intData + K
  MsgBox dblData
End Sub
'-------------------------------------------

と定数5000を予めDoubleの変数に入れておき、
計算などのときはその変数を使うのが普通です。
 

この回答への補足

早速の回答感謝です。

しかも例があって分かりやすいこと!

理解できてきました。

その後ソースを読み進んでいくと、更に謎な部分が出てきました。

'_______________________________________________
Dim Data As Double

Data = 0#

'________________________________________________

duble型と宣言しているのに、また#付きとは。
この場合は#なくても同じということに・・・?

補足日時:2009/04/21 16:16
    • good
    • 0

以下のサイトなど参考になるでしょう。



データ型を参照

http://www.komonet.ne.jp/~vb/chap4.htm
 
 
    • good
    • 1
この回答へのお礼

ありがとうございました。
以後、参考にします。
今回以外の件でも参考になります。

お礼日時:2009/04/21 14:00

ここで使用されている「#」は、型宣言文字です


サフィックスと称されます

なので、
1# は、 Double型の1です

VB6の型宣言文字には、他にも「!(Single)」「$(String)」等があります
ぐぐってみるのもいいでしょう

コードのほうは・・・

この回答への補足

早速の回答ありがとうございます。
すみませんもう少し御教示ください。

1というdouble型の変数を宣言したということでしょうか?

それともここで使用している1はdouble型ですよという意味・・・ 同じこと?

混乱してきました。。。

補足日時:2009/04/21 14:09
    • good
    • 0

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

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

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

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

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

Q条件付きコンパイル: #IF 1 Then と #IF 0 Then

条件付コンパイルで、
『#If 1 Then』と『#If 0 Then』の条件の違いを教えてください。


『#If ○○○=1 Then』などの場合はわかるのですが、
単に『#If 1 Then』の場合は何をもって真となるのでしょうか?

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

Aベストアンサー

条件式は、強制的に「True」又は「False」に解釈されます。

で、「数値」を「True」又は「False」に解釈する場合、
「0」は「False」、「0以外」は「True」になります。
(http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/script56/html/vsfctcbool.asp)

つまり、
『#If 1 Then』は、「必ずTrue」=常に有効
『#If 0 Then』は、「必ずFalse」=常に無効
に成ります。

QVBの質問#if 0 then ってどう言う意味?

VBの質問です。

処理1
#If 0 Then
処理2
#End If
処理3

てどういう意味ですか?

Aベストアンサー

#1 の方がおっしゃる通り、条件付きコンパイルです。

これは、

>処理1
>#If 0 Then
>処理2
>#End If
>処理3

こういうプログラムと同じです。

処理1
処理3

つまり、処理2のとこを削除してしまってもコンパイルしたプログラムは、同じなんですよ。

んで、特に、
>#If 0 Then
っていうのは、処理2のとこを、
「削除したことがわかるように(履歴を残したまま)削除する」
ということで、バグ修正や仕様変更などバージョンアップで削除するときに、よくやる慣習みたいなもんです。

C言語などでもよく同様のことをやります。

#Else もあるので、使いようによっては、便利です。

#ここだけの話、「万が一、修正したのが間違っていても、すぐ元に戻せるよ~ん」という感じで、なんだか男らしくなくて私は嫌いなんですが・・・

#ちなみに、私の周辺では、バックアップもとらずに、要らない(と思われる)ソースファイルを一気に削除する「男の子ごっこ」がはやってます。(アホですね)

#1 の方がおっしゃる通り、条件付きコンパイルです。

これは、

>処理1
>#If 0 Then
>処理2
>#End If
>処理3

こういうプログラムと同じです。

処理1
処理3

つまり、処理2のとこを削除してしまってもコンパイルしたプログラムは、同じなんですよ。

んで、特に、
>#If 0 Then
っていうのは、処理2のとこを、
「削除したことがわかるように(履歴を残したまま)削除する」
ということで、バグ修正や仕様変更などバージョンアップで削除するときに、よくやる慣習みた...続きを読む

QVBAのプログラムで、DIAG = 1# / A(L, L) や R(

VBAのプログラムで、DIAG = 1# / A(L, L) や R(I) = 0# の数字1、0の後についている番号記号#は何を意味しているものでしょうか?

http://www.index-press.co.jp/books/excel/excel-04.pdf

の記事内にあるプログラムで使用されていますが、解説がありません。
調べてみましたがシャープと読まないことぐらいしかわかりませんでした。

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

Aベストアンサー

Pdf拝見しました。
凄く読みづらいプログラムで、どうにか修正したい欲に
かられるわけですが。

ここでいう♯記号などは、「リテラル」というもので型を
暗黙に示すもので、#はDouble型を示すものだと思います。

言語が違いますが仕様が似てますので参考まで。
3-1 変数と定数
 http://msdn.microsoft.com/ja-jp/library/dd314343.aspx
 …真ん中のほう:
 …VB .NET はリテラルのデータ型に応じて、以下のような表記をします(表 3-2)。
 …の明示的な記述方法の列

1♯ はDouble型の1ということになります。
基本的に、Dim i as Double と宣言すれば i はDouble型に決まって
いますので♯は要りませんが。

稀に Dim i as Variant(何でも型)と宣言したとき、i=1#とすると
Double型として明示代入ができます。
とはいえ、変数の中身が訳がわからなくなるので、こんな書き方は
通常はしません。
プログラム文中を判りやすく見せているだけだと思います。


とはいえ、このプログラムは読みづらいです。
変数、配列のインデクサ、ループカウンタなど殆どが英字2文字以下の
意味のない単語変数なので、可読性のよいプログラムクォリティとしては
よろしくないと思います。

Pdf拝見しました。
凄く読みづらいプログラムで、どうにか修正したい欲に
かられるわけですが。

ここでいう♯記号などは、「リテラル」というもので型を
暗黙に示すもので、#はDouble型を示すものだと思います。

言語が違いますが仕様が似てますので参考まで。
3-1 変数と定数
 http://msdn.microsoft.com/ja-jp/library/dd314343.aspx
 …真ん中のほう:
 …VB .NET はリテラルのデータ型に応じて、以下のような表記をします(表 3-2)。
 …の明示的な記述方法の列

1♯ はDouble型の1ということになります。...続きを読む

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

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

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

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別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

QVBでグローバル変数を宣言するには

VB初心者ですが。クイズゲームのようなものを作成したいと考えてます。
Private Sub ~ End Sub の中で宣言した変数って他のところに呼び出したり(戻り値として渡す)出来るのでしょうか?
どこでも、いつでも呼び足せるグローバル変数の宣言とはどのようにやるのか、具体的に教えていただけないでしょうか?

Aベストアンサー

>Public a as Integerのように宣言して、初期化するにはどのように記述を行えばよいですか?

>Public a As Boolean = 0
のように記したら”コンパイルエラー”と出ました。

Booleanって整数値取れたかなと思いつつ。
Sub~End Sub内でa = 0を代入したりしてください

扱おうと言うことがあるかどうか疑問だけど

Public Const a As Integer = 10 'グローバルな定数の宣言

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

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

Aベストアンサー

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

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

QVBとVBAの違い

お世話になります。

現在、ExcelVBAで機械設計の計算をさせようと思い勉強しているのですが、VBとVBAの違い(VBと比較したとき、VBAできること、できない事)の境目?がいまいち判りません。
まだまだ勉強中で困惑しております。このままExcelVBAを勉強していく物か、VBについて勉強していくか迷っています。このままExcelVBAを勉強してExcelVBAを理解すれば判断できるかと思うのですが、畑違いの勉強になってしまわないかと心配です。

やりたいことは、各種計算の簡略化です。
現在は、関数電卓で行っていますが、これをパラメータを入力すると計算結果が出る。このような物を作りたいと思っています。

長くなってしまったのでまとめると、
1、VBAとVBの違い
2、ExcelVBAで設計計算が可能か
あと、
プログラムにより計算させるときに、最適なプログラム(JavaとかPHPとかHTML等など・・・)お勧めのプログラムがありましたらアドバイス頂けたらと思います。

Aベストアンサー

1. VBAとVBの違い

VBは単体で動作するアプリケーションが作れますが、VBAはOfficeが必要です。
また、VBAはOfficeの環境が使えるので、Excel等を使った入出力の機能が既にできていますが、VBではある程度自分で作る必要があります。また、費用的な面でVBは購入しないと使えませんが、VBAはOfficeがあれば使えますので、既にExcelなどを導入されているならば、追加の費用が必要ありません。
もし、複数の人間で作ったプログラムを利用され、かつその中にOfficeを持っていない人が含まれるのであればVBAではできませんので、VBが必要です。

2. ExcelVBAで設計計算が可能か

可能です。また、多分VBAを使わなくてもExcelの関数でもある程度のことが可能だと思われます。お持ちの関数電卓の桁数にもよりますが、相当な高精度が必要でない限り大丈夫です。

文面からすると、プログラミング未経験のようですが、やりたいことが明確なので、Excelをお持ちであればVBAで始めてみてはいかがでしょうか。他の言語(Java, C, PHP...)でも可能でしょうが、中には環境を用意しなくてはならなかったり、本質である計算以外に気にしなくてはならないことが多く、初心者にはとっつきづらいのではないかと考えます。

VBAからVBへの移行、VBからVBAへの移行はどちらも可能ですし、VBAからVBへの移行は多少時間がかかるかもしれませんが、VBよりVBAから始める方が楽なので、どちらに優越があるとは一概に言えないと思います。一人でちょっと使う程度や勉強用なら、ExcelVBAをお勧めします。
しばらくすると、ExcelVBAの限界を感じるようになると思うので、そこからVBに移行するというのでも悪くないと思います。

1. VBAとVBの違い

VBは単体で動作するアプリケーションが作れますが、VBAはOfficeが必要です。
また、VBAはOfficeの環境が使えるので、Excel等を使った入出力の機能が既にできていますが、VBではある程度自分で作る必要があります。また、費用的な面でVBは購入しないと使えませんが、VBAはOfficeがあれば使えますので、既にExcelなどを導入されているならば、追加の費用が必要ありません。
もし、複数の人間で作ったプログラムを利用され、かつその中にOfficeを持っていない人が含まれるのであればVBAではで...続きを読む


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

人気Q&Aランキング