新生活!引っ越してから困らないように注意すべきことは?>>

VBの構造体の命名はどうすればいいですか?
strXXX as string
intYYY as integer
???ZZZ as 構造体
udtZZZ as 構造体 でいいのでしょうか?
ユーザー定義型ということでいいのでしょうか?

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

A 回答 (2件)

こんにちは。

KenKen_SP です。

ご質問のように変数にプレフィックスを付ける表記をハンガリアン表記法
と呼び、MS がかつて推奨していたものです。特に Visual Basic 6.0 まで
広く使われていました。

これに従うならば、ご質問にある変数名で良いと思います。

しかし、現在は MS は推奨していません。それどころか、一転してハンガ
リアン表記法はむしろ MSDN にある名前付けのガイドラインに違反した
表記法とされています。

詳しくは、MSDN ライブラリを参照して下さい。

これには賛否両論があり、どちらが良いのかは議論がなされている最中です
が、今後 MS がハンガリアン表記法を推奨しないことを考えれば、いずれは
使われなくなく表記法ですね。

どちらが良いのか、その是非については述べません。ご自身が判断するべき
ことだからです。何より大切なポイントは自分が見ても、他人がみても

  「変数名はわかりやすく」

です。このような表記法の変化に振り回されて、このポイントがおろそかに
なるようではどんな表記法も無意味です。その意味で #1 ご回答の

> 1)見たら判る、(2)一貫している、ならばOKではと考えます。

は、的確でまさにその通りだと思います。

個人的な好みの話をすれば、私は通常変数にはプレフィックスを付け、
構造体のメンバには付けません。

Private Type STAFFINFO
  ID   As Long
  Name  As String
  Address As String
  Tel   As String
End Type

Sub xxxx()

  Dim udtSI as STAFFINFO
  With udtSI
    .ID = 1
    .Name = "名前"
    .Address = "住所"
    .Tel = "012-3456-7890"
  End With

End Sub

のような感じですが、プレフィックスを付けると

  With udtSI
    .lngID = 1
    .strName = "名前"
    .strAddress = "住所"
    .strTel = "012-3456-7890"
  End With

となって、通常変数なのか構造体のメンバなのか見難くなるからです。

余談ですが、構造体のことを VB では「ユーザー定義型」と表現してます。
私見でした。
    • good
    • 0
この回答へのお礼

貴重なご意見ありがとうございました。

お礼日時:2008/01/20 21:31

マイクロソフトが推奨している命名規則に関する質問であれば、それで宜しいと思います。


が、私は、

Dim mudtMenu AS MENU_TYPE

でなく

Dim MyMenu As MENU

としています。

Dim typMenu As MENU

も、「ありかなー」と思います。

要は、(1)見たら判る、(2)一貫している、ならばOKではと考えます。

Private Type MENU
  TitleCaption   As String * 24 ' トップメニュータイトル
  MenuCount     As Integer   ' メニュー総数
  SubItems(5)    As Integer   ' 各メニューの項目数
  MenuNames(5)   As String * 16 ' 主メニュー名
                   ' ----+----1----+----2----
  LargeIcons(5, 19) As String * 24 ' Icons\Large\xxxxxxxx.ico
  SmallIcons(5, 19) As String * 24 ' Icons\Large\xxxxxxxx.ico
  IconTexts(5, 19) As String * 12 ' アイコンテキスト
  AppTypes(5, 19)  As String * 1  ' アプリケーションの種類
  AppNames(5, 19)  As String * 20 ' アプリケーション名
  AppDescs(5, 19)  As String * 32 ' アプリケーションの説明
  ViewMode     As Integer   ' 表示モード
End Type
Dim MyMenu As MENU
    • good
    • 0
この回答へのお礼

PCが動かなくなり、IDが分からなくなってしまって
お礼が遅れてしまいました。
ご回答どうもありがとうございました。
参考にさせていただきます(^^)

お礼日時:2007/03/03 00:22

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

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

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

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

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

Q定数配列の書き方

VB6で定数を定義する場合は次の通りです。

  Const strTest As String = "TEST"

では、定数配列を定義する場合はどのように書けばいいのでしょう?

  Const astrTest() As String = Array("A", "B", "C")      '→NG
  Const astrTest(0 To 2) As String = Array("A", "B", "C")  '→NG

いろいろな書き方を試して見たのですが、上記のような書き方でも文法的にエラーになるようです。

どのように書けばいいのでしょうか?

それとも定数を配列で定義するのは無理なんでしょうか?

Aベストアンサー

残念ですが、VBでご希望のことをすることはできません。

Qプロシージャ名の取得

教えてください。
VBで現在実行しているプロシージャ名を取得指定のですがkのようなことは可能ですか?
可能ならばどのようにすればいいか教えてください。

現在実行ファイルにて起動しているのですが、どこかで「実行エラー」が発生しています。
この実行エラーの場所の特定のために、現在起動中のプロシージャ名をログに保存しようかと考えています。
また、その他このようなエラー箇所特定方法などがありましたら教えてください。
環境:VB6.0  Win2000

Aベストアンサー

残念ながら出来ません。

私のプロジェクトでは全てのプロシージャに On Error コーディングをして、そこでログにどのプロシージャかを書いてました。

そういう方法しかないと思います。

Q動的配列が存在(要素が有る)か否かを判定できますか?

VBAで、「For ループが初期化されていません」エラーが発生します。
動的配列が要素0の時に発生するようです。
動的配列の要素が生成された場合だけ、Forループしたいのですが、
どうやって判定すればよいのでしょうか?
-------------------------------
Dim 配列() As Integer
Dim i As Integer
i = 0
If (i < 0) Then ' 本当は真になったり偽になったり
ReDim 配列(0 To i)
配列(i) = a + b
i = i + 1
End If

'' if ★★★ then '' 配列が有るか確認
For Each c In 配列
MsgBox c
Next
'' end if
-------------------------------

Aベストアンサー

こんにちは。

動的配列の要素が生成された時だけ、For ~Loop するなら、#2 さんのご指摘のように、動的配列を生成したときに、フラグを立てるのが一番簡単ですね。配列変数を、Integerと最初から宣言してしまっていますから、それ自体が変化したことを、値を取り出す方法以外には、チェックできませんね。

以下は未知の変数の配列を調べる場合、VBAでは以下のような方法を使います。

 On Error Resume Next
 dummy = 配列(0)
 Err.Clear  'プロシージャ内で、使いまわしする場合は、必要
 On Error GoTo 0
 If dummy <> Empty Then
  For Each c In 配列
   MsgBox c
  Next
 End If
 dummy = Empty 'dummy を使いまわしする場合は、一旦空にする。

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

QDAOとADOの違いについて

Accessからイントラネット上のデータベースに接続するための接続方法で困っています。
DAOとADOの違いが分からず困っています。
メリット、デメリットが分かる方、どうか教えてください。

宜しくお願い致します。

Aベストアンサー

DAO(データアクセスオブジェクト)はAccessで使用されるMicrosoftJetデータベースエンジン を公開した最初のオブジェクト指向インターフェイスです。DAOは単一システムのアプリケーションや小規模でローカルなネットワークで使用するのに最も適しています。
とMSDNライブラリでは説明しています。
DAOはJetデータベースエンジンを対象にして開発されているのでJetのもつセキュリティ機能・データ定義機能などを十分に操作することができます。
ADO(ActiveXDataObjects)ではオブジェクトの種類が簡素化されているためJetデータベースエンジンの細かな機能を制御することができないといった点が不足している部分がありますがADOXやJROの各オブジェクトモデルで使用できる機能を使えばADOで不足している機能をほとんど補うことができます。
DAOはデータベースにAccessを使用するアプリケーションの場合、最大のパフォーマンスを得ることができます。しかしアプリケーションを運用していくうちに規模が大きくなってデータベースをSQLServerに移行することがあるかもしれません。
そのような可能性が含まれているのであれば最初からADOで開発しておいたほうが無難です。ADOはSQLServerに対する処理で良いパフォーマンスを得ることができます。

Jetデータベースエンジンを主なターゲットにしているならDAOで可。それ以外のデータベースを利用するのであればADOを選択する方が良いのではと思います。

DAO(データアクセスオブジェクト)はAccessで使用されるMicrosoftJetデータベースエンジン を公開した最初のオブジェクト指向インターフェイスです。DAOは単一システムのアプリケーションや小規模でローカルなネットワークで使用するのに最も適しています。
とMSDNライブラリでは説明しています。
DAOはJetデータベースエンジンを対象にして開発されているのでJetのもつセキュリティ機能・データ定義機能などを十分に操作することができます。
ADO(ActiveXDataObjects)ではオブジェクトの種類が簡素化されて...続きを読む

QSELECTで1件のみ取得するには?

こんにちわ。
いまORACLE9iを使用している者です。

ACCESSでは
SELECT TOP 1 項目名 FROM テーブル名
ORDER BY 項目名;
で並べ替えたデータ群のうち,先頭の1件だけを
取ることができますが,
ORACLEでそのような機能(SQL)はあるでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

order by と rownum を併用する場合は注意が必要です。

[tbl01]
cola | colb
------------
1000 | aaaa
1001 | bbbb

というデータがある場合、
select cola from tbl01 where rownum < 1 order by cola desc;
とすると、「1001」ではなく、「1000」が返されます。
これは、order by の前に rownum < 1 が適用されてしまうからです。

解決するには、
select aaa from (select cola aaa from tbl01 order by cola desc) where rownum = 1;
とすれば良いです。

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

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

QVBA オブジェクトが空かどうか判定する

皆様のお知恵を拝借させてください。

エクセルVBAでオブジェクトを入れる変数を定義し、その変数にオブジェクト
が入っているかどうか検査したいのですがどうしたらいいでしょうか。

例えば---
Dim a As Workbook
If a <> nothing then ←この部分が分からない。このままだとエラー。
処理
End if
---------
環境
エクセル2003
WinXPsp1

Aベストアンサー

もし、aが空だったら
If a Is Nothing Then 

もし、aが空じゃなかったら
If Not a Is Nothing Then

QDATE型変数を初期化する方法

他の変数みたいに
ゼロや""では初期化は出来ないのでしょうか?

Aベストアンサー

初期化とはプログラムループに入る前にある値にプログラムコーディングで設定することですよね。
下記によると、「出来る」といえるのではないですか。
それとも例えば、INISIALIZE関数やメソッドがあるか
と言う質問ですか。
VB(VBAですか。そこをはっきり書かないと。)で
下記サンプルプログラムをやって見ました。
Private Sub Form_Click()
Dim d As Date
d = "0"
Form1.Print "ここを通りました"
Form1.Print d
Form1.Print Format(d, "yy/mm/dd")
MsgBox Year(d)
MsgBox Month(d)
MsgBox Day(d)
End Sub
Form1には00:00:00、89/12/30が表示され、MSGBOXでは1899、12,30(31で無い)と表示されました。
こう言うことはエクセルの日付に似ており、シリアル値
のスタート日を表示しているところから、その値でセットされているはず。したがってd+1とか整数的演算が可能と
言うことであり、表示する時だけyyyy/mm/ddほか書式に
したがってVBが表示してくれると思う。
ただこの利用法は思いつかないが。
""に付いてはやっていませんが。

初期化とはプログラムループに入る前にある値にプログラムコーディングで設定することですよね。
下記によると、「出来る」といえるのではないですか。
それとも例えば、INISIALIZE関数やメソッドがあるか
と言う質問ですか。
VB(VBAですか。そこをはっきり書かないと。)で
下記サンプルプログラムをやって見ました。
Private Sub Form_Click()
Dim d As Date
d = "0"
Form1.Print "ここを通りました"
Form1.Print d
Form1.Print Format(d, "yy/mm/dd")
MsgBox Year(d)
MsgBox Month(d)
MsgBox Da...続きを読む

Qユーザー定義型変数の一括初期化

ユーザー定義型の変数を初期化する場合、
各エレメントごとに初期化をすればいいのですが、
C言語のmemset()の様に、一括で初期化をする方法はありますか?

Aベストアンサー

空のユーザー定義型変数を代入してやればよい。

Public sub EraseTypeHoge(byref Data as TypeHoge)
Dim nul as TypeHoge
Data = nul
end sub


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

人気Q&Aランキング