Visual Basic5.0(SP3)を使用しています。
DAO3.5を使用してAccess97で作成したテーブル(既にレコードが登録されているテーブル)のフィールドのデータ型を変更したいのですが、方法はありますか?
例えば、整数型(Integer)を長整数型(Long)にといったように...。

FieldオブジェクトのTypeプロパティにセットしようとしたのですが、読み取り専
用のためできません。

トピックで
「Visual Basic の中で、DAO の Type プロパティを使って、フィールドを
Fields コレクションに追加する前に、データ型を設定できます。」
と書かれてあるのを見つけました。と言う事は変更できないのでしょうか?

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

A 回答 (5件)

対象となるテーブルを再作成してよいのなら、


テーブル作成クエリーを使うとかなり楽です。

例)
元テーブル<TB1>
項目 :データ型
TEST1:Char
TEST2:Integer
TEST3:Binary

実行SQL
SELECT TB1.TEST1,
CSTR(TB1.TEST2) as TEST2, CINT(TB1.TEST3) as TEST3
INTO TB2 FROM TB1;

作成後テーブル<TB2>
項目 :データ型
TEST1:Char
TEST2:Char
Test3:Integer

で、元のテーブルをDeleteすればOK

実際の運用を考えると、テーブル名を変えたくないので、
元テーブルの名前を変えてから、新テーブルを元の名前で作成するか、
作った後から名前を変えるかしてください。

ただし、一時的にせよmdbの中で同一データのテーブルが2つになるので、
データが大量にあるテーブルの場合には、この方法はあまりお勧めしません。

はずしてたらすいません。^^;
    • good
    • 0
この回答へのお礼

ありがとうございます。
さっそく試します。

お礼日時:2001/09/17 09:06

以下のようにすればどうでしょうか?



1.対象のテーブルのTableDefオブジェクトよりフィールド
 情報を取得する。
2.DatabaseオブジェクトからテーブルをDeleteする。
3.TableDefsオブジェクトを新規に作成する。
4.1の情報を設定する。(この時フィールド型を変更)
5.DatabaseオブジェクトにTableDefsオブジェクトをAppendする。

一度、試して見て下さい。
    • good
    • 0
この回答へのお礼

ありがとうございます。
試してみます。

お礼日時:2001/09/17 09:07

すみません。

質問をちゃんと読んでいませんでした。
オラクルでやってたことですので、DAOでできるのか分かりません。
失礼しました。(はずかしー)
    • good
    • 0

こんにちは。


SQL文ではダメでしょうか。(^^;

1.新テーブルの作成
create table 新テーブルの別名 (・・・);

2.データ移植
insert into 新テーブル別名 (select * from 元テーブル);

3.元テーブル削除
drop table 元テーブル;

4.データ移植
create table 新テーブル as (select * From 新テーブルの別名);

または、

create table 新テーブル (・・・);
insert into 新テーブル (select * from 新テーブルの別名);


的を得ていなかったらごめんなさい。m(_ _)m
    • good
    • 0

Adoでも使うのですが、


String関数や、Cint関数を使ってみるのは、どうでしょう?
私自身、仕事でよく使ってますけど、例えばsqlでそのテーブルでのMax値を取ってきて、Cint関数で数値型にして欲しいデータを生成したりしてます。

関数に関しては、分かりますか?日付を生成したりする関数なんかもあるので、関数を知っていれば、便利ですよ!
\(^o^)/

この回答への補足

お返事ありがとうございます。
ちょっと質問の内容があいまいでしたので補足します。
ACCESSのテーブルのフィールド定義そのものを変更したいのです。
と言いますのは、仕事で開発したシステムで、当初、あるフィールドを「整数型」で定義していたのですが、後に「長整数型」の数値を格納しなくてはならなくなり、フィールド定義の変更が必要になってきました(システムを収めた客先全てでです)。
新しいテーブルを作成し、そこにデータを移行してもいいのですが、簡単にフィールド定義を変更できれば手間や、ミスを防げます。
よろしくお願いします。

補足日時:2001/09/13 09:22
    • good
    • 0

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

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

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

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

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

QExcel VBAで、セルに入ってるデータ型を調べる方法は?

現在、Excel VBAでプログラムを作成しています。

Do Until ~ Loop の終了条件を
アクティブセルに入っているデータの型が文字列型の時
としたいのですが、そのようなことは可能なのでしょうか?

可能だとしたら、どのように記述したらいいのでしょうか?

当方のPCは
Win XP、Excel2003
です。

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

Aベストアンサー

VarType 関数を使うとか。

Sub SampleProc()

  Dim i As Long
  
  i = 1
  Do While Len(Cells(i, "A").Value) > 0
    If VarType(Cells(i, "A")) = vbString Then
      Exit Do
    Else
      ' // 処理
    End If
    i = i + 1
  Loop
  MsgBox CStr(i) & "行目で停止"

End Sub

QVisual Basic 2005でのLabelのプロパティ

現在、あるプログラムを作成中です。
Labelを作成してそのLabelの文字位置を右寄せにすることは可能でしょうか?
プロパティやヘルプを探してみたのですが見当たりません。

Visual Basic 6の時代にはそういうプロパティがあった気がするのでないはずはないと思います。

わかる方はよろしくお願いします。

Aベストアンサー

LabelコントロールのAutoSizeプロパティがFalseであることを前提に
TextAlignプロパティを使って下さい

http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.label_members(VS.80).aspx

QVBAで計算した結果がデータ型により相違してしまいます。VBAに詳しい

VBAで計算した結果がデータ型により相違してしまいます。VBAに詳しい方、理由を教えてください。よろしくお願いします。

Dim 税率 As Single
Dim 売上 As Double
単価=Range("b5").Value:個数=Range("d5").value:税率=Range("f5").Value
売上=(1+税率)*単価*個数
(1)単価=30000、個数=15、税率=0.05と入力すると売上の数値=472500.000335276となります。
(2)売上のデータ型をsingleにした場合は、売上=472500となります。
(3)売上のデータ型Single、税率のデータ型をDoubleとした場合も売上=472500となります。
(1)の結果の小数点以下の数値の意味がわかりません。
よろしくお願いいたします。

Aベストアンサー

計算する値がDouble型を含む場合、その項と計算する項はDouble型でなくとも、Double型に自動キャストされて計算が行われます。

Double型での計算結果は誤差が付き物です。

「Double」と「誤差」で履歴を検索
http://okwave.jp/search?word=Double+%E8%AA%A4%E5%B7%AE&boolean=and&target=&ques_stat=&c_select=true&date=&sort=score&c=257


あまり大きな桁が異なる計算を行うと誤差が出るかも知れませんが、
※全ての変数 As Currency
とすると、ある程度の対応が出来ます。

Qinteger型、long型、double型

vb6.0についてお聞きいたします。
こちらの問題は、visual studio 2005のvbでは生じません。

windows xp上で動かしているのですが、どうやら
何もしていないあるパラメータに32000ぐらいの数字よりも大きな
数字をいれるとエラーになってしまいます。

それも、integer型、long型、double型のすべての型で生じます。
そういうものなのでしょうか?
HPをいろいろ見ましても、long型で20億ぐらいは
表現できるように書いてあるのですが。

Aベストアンサー

手元のExcel VBA(VB.NET系ではなくVB6系)で実験してみました
LongとDouble共に再現しません。
Integerの場合
http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200304_03040036.html

>VB6ではIntegerが16bit、Longが32bitでしたが、
NETではIntegerが32bit、Longが64bitに変更されてますので。

割と有名ではあるんですが、Microsoft公式の文書を探すのが面倒くさいので放置。(2^16)/2 - 1 = 32767(正と負があるから。VB6のIntegerは-32768~32767しか取れない)
==============================
Option Explicit

Sub hoge()

Dim a As Long

a = 33000
MsgBox (a)


End Sub
===========================
Option Explicit
Sub hoge2()

Dim a As Double

a = 33000
MsgBox (a)


End Sub
=====================
Option Explicit
Sub hoge3()

Dim a As Integer

a = 33000
MsgBox (a)


End Sub

手元のExcel VBA(VB.NET系ではなくVB6系)で実験してみました
LongとDouble共に再現しません。
Integerの場合
http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200304_03040036.html

>VB6ではIntegerが16bit、Longが32bitでしたが、
NETではIntegerが32bit、Longが64bitに変更されてますので。

割と有名ではあるんですが、Microsoft公式の文書を探すのが面倒くさいので放置。(2^16)/2 - 1 = 32767(正と負があるから。VB6のIntegerは-32768~32767しか取れない)
==============================
Option Ex...続きを読む

QVBAでの0のデータ型は

VBAの初心者です。ExcelのVBAで小数点2桁の変数Xのデータ型を宣言したいのですが、このXは”0”の時もあります。
このような時はこの変数の型はどのように宣言したら良いのでしょうか、定義では、”Single”には正の範囲と負の範囲があって”0”がないようなのですが?

Aベストアンサー

Singleで問題ないと思います。
(通貨型の方がいい場合もありますが;詳細はヘルプを参照下さい)

確かに、ヘルプで単精度浮動小数点型(Single)を見ると「負の数は~、正の数は~」と表記されて
いますが、実際に代入してみるとわかるように「0」も設定可能です。

にもかかわらず、長整数型のように「-○○~+○○」といった表記をしないのは、それと同じように
しまうと、実際に使用可能な桁数より小さいものまで含むことになってしまうからです。

・・・まあ、「負の数は~、正の数は~」に続けて、「及び0が設定可能」とするのが、確かに
一番親切な表記だとは思いますけれど。

QVisual CのコードをVisual Basicに直したいです

検索でVCのコードしか見つからず、VBに直しているのですが、下記がわかりません。

[VC]
public ExtendedWebBrowserSite(ExtendedWebBrowser wb) : base(wb)
{
parent = wb;
}

下記のところまでは、出来たのですが、最後の「 : base(wb)」の部分はどのようにすればよいのでしょうか?
[VB]
Public Sub ExtendedWebBrowserSite(ByVal wb As ExtendedWebBrowser)
parent = wb
End Sub

ご存知の方、よろしくお願いいたします。

Aベストアンサー

Convert C# to VB.NET
http://www.developerfusion.com/tools/convert/csharp-to-vb/

Qエクセル2013VBA 列のデータ型更新の最速なやり方は?

Excel 2013 VBA
A列に16000行の数字が文字列として入っています。
これを数値型に変えたいのですが、一番早い方法はありますか?
今VBAでしている方法は、For nextで回して、セルのデータ型を数値型に変換→Aのセルの値を同じセルに入れなおすというやりかた

これは気が遠くなるほど時間がかかります。

教えていただけると非常に助かります。

Aベストアンサー

外部データをインポートしたりすると数値が数字になってしまいイラつきますよね。
現在は VBA でやっているようですが、VBA 以外の方法でもよいのでしょうか?

【方法 1】
(テキストファイルをインポートするのであれば)
1. 外部データ ファイルの拡張子が csv なら txt に変更する。
2. Excel で開くときに [テキスト形式] のファイルに切り替えて上記のファイルを読み込む。
3. データをインポートするウィザードが動くので、当該列の形式を数値に指定する。

【方法 2】
別の列にいったん移す方法
問題の列が B列だとして、
1. 隣の C1 に 「=B1*1」 というように 1を掛ける計算式を仕込む。
2. C列を選択してコピーし、B列に値貼り付けする。

【方法 3】
方法 2 を別のアプローチで行う方法
1. 問題のセルの書式設定が「文字列」になっていれば「標準」に変更する。
2. まったく関係ないセルに数値の 1 を入力する。
3. そのセルをコピーする。
4. 問題のセルを選択する。
5. [ホーム] タブの [クリップボード] にある [貼り付け] の下の矢印をクリックして [形式を選択して貼り付け] を選択。 [演算] の [乗算] を選択して [OK] をクリックする。

【方法 4】
データの区切り位置ウィザードで一気に解決する方法
1. 問題のセルの書式設定が「文字列」になっていれば「標準」に変更する。
2. 問題の列が B列だとして、B列全体を選択する。
3. [データ] リボンの [データ ツール] タブにある [区切り位置] をクリックする。
4. 区切り位置指定ウィザードが起動する。
5. [次へ] ボタンじゃなく、いきなり [完了] ボタンをクリックする。

【方法 5】
Excel のエラー チェック機能で一気に解決する方法
1. 問題の列全体、または問題のセル群を選択する。
2. 選択範囲の右上にドッキリマークのアイコンが表示される。
3. アイコンをクリックして [数値に変換する] をクリックする。

外部データをインポートしたりすると数値が数字になってしまいイラつきますよね。
現在は VBA でやっているようですが、VBA 以外の方法でもよいのでしょうか?

【方法 1】
(テキストファイルをインポートするのであれば)
1. 外部データ ファイルの拡張子が csv なら txt に変更する。
2. Excel で開くときに [テキスト形式] のファイルに切り替えて上記のファイルを読み込む。
3. データをインポートするウィザードが動くので、当該列の形式を数値に指定する。

【方法 2】
別の列にいったん移す方法
問題の列が ...続きを読む

QInteger型をString型に

Integer型をString型にするにはどうしたらいいんですか?

Aベストアンサー

VB、VBAなら
CStr(変数名)

VB.NETなら
変数名.ToString()
も使えます。

参考URL:http://santamartadotnet.hp.infoseek.co.jp/documents/vbdotnetbasic/04_conversion.html

QVBAのデータ型に関する質問です。 以下のような宣言と処理をしました。

VBAのデータ型に関する質問です。 以下のような宣言と処理をしました。
Dim 数値1 As Integer
Dim 数値2 As Integer
Dim 数値3 As Long
数値1=Range("b5").Value
数値2=Range("c5").Value
数値3=数値1*数値2 この式では、数値3がLongの型ではなくIntegerになってしまいオーバーフローのエラーになってしまいます。(10000×5の場合等)Long型のまま代入する方法がありましたら教えてください。よろしくお願いいたします。

Aベストアンサー

数値3はlong型で宣言してあるので、long型だと思います。
この場合は数値1*数値2の時点でinteger型×integer型なので、
代入以前の演算の段階でオーバーフローが発生すると思われます。

全ての変数をlong型で宣言するのはどうでしょうか?

integer型というのは1世代前のプログラミング概念による変数型です。
当時は8ビットまたは16ビット処理だったのでinteger型がコンパクトで
処理も速かったのです。
しあkし、現在では32ビットまたは64ビット処理なので、long型の
方が都合がいいのです。今のinteger型は以前のプログラムと互換性を
保つためにあり、long型の半分をマスクしているに過ぎず、32ビット
ずつメモリーを消費します。つまり、integer型のメリットは無くなって
いるのです。

それから、厳密に言えばセルの値はバリアント型です。
Long型=variant型 でもプログラムは自動的に左辺の型に合わして
くれますが、正式にはint関数をかませたほうがいいでしょう。

QAccessのDAOでフィールド名を配列に格納して・・・

Access2000のDAOで下記のようなコードで複写元テーブルから複写先テーブルにデータを追加するとします。

Set Rs1 = Db.OpenRecordset("複写元", dbOpenTable)
Set Rs2 = Db.OpenRecordset("複写先", dbOpenTable)

Do Until Rs1.EOF
Rs2.AddNew
Rs2!FL1 = Rs1!名前
Rs2!FL2= Rs1!性別
Rs2!FL3= Rs1!郵便番号
Rs2!FL4= Rs1!住所
   ・
   ・
Rs2! FL50= Rs1! 50番目
Rs2.Update
Rs1.MoveNext
Loop

複写元のフィールドが50フィールドもあると、いちいちRs1!名前とかRs1!性別とか記述するのが大変ですし、ものすごく長いコードになります。そこで、配列にしてやったらどうだろうかとこんなことをしてみましたがだめでした。

Dim I
Dim FieldsName
FieldsName=Array("名前","性別",・・・"50番目")
           ・
           ・
Do Until Rs1.EOF
Rs2.AddNew
For I=0 To 49
Rs2!フィールド(I) = Rs1!FieldsName(I)
Next
Rs2.Update
Rs1.MoveNext
Loop

じゃあTebleDifのTd.Fields().Nameを使って・・・・やっぱり失敗しました。

For I=0 To 49
Rs2!フィールド(I) = Rs1!Td.Fields(I).Name
Next

やりたいこと分かっていただけますでしょうか?要するにフィールド名を配列の様なもので格納しておいて、レコードの追加時に50回ループさせてRS2のフィールドにいれたいのです。何か良い方法は無いでしょうか。

Access2000のDAOで下記のようなコードで複写元テーブルから複写先テーブルにデータを追加するとします。

Set Rs1 = Db.OpenRecordset("複写元", dbOpenTable)
Set Rs2 = Db.OpenRecordset("複写先", dbOpenTable)

Do Until Rs1.EOF
Rs2.AddNew
Rs2!FL1 = Rs1!名前
Rs2!FL2= Rs1!性別
Rs2!FL3= Rs1!郵便番号
Rs2!FL4= Rs1!住所
   ・
   ・
Rs2! FL50= Rs1! 50番目
Rs2.Update
Rs1.MoveNext
Loop

複写元のフィールドが50フィールドもあると、いちいちRs1!名前とかRs1!性別とか記述す...続きを読む

Aベストアンサー

#2です。

一応自分なりにコードを作ってみました。

Dim I As Integer, Db As Database, Rs1 As Recordset, Rs2 As Recordset

Set Db = CurrentDb
Set Rs1 = Db.OpenRecordset("複写元")
Set Rs2 = Db.OpenRecordset("複写先")

Do Until Rs1.EOF
Rs2.AddNew
For I = 0 To 49
Rs2.Fields(I).Value = Rs1.Fields(I).Value
Next
Rs2.Update
Rs1.MoveNext
Loop
Rs2.Close
Rs1.Close
Set Rs2 = Nothing
Set Rs1 = Nothing
Set Db = Nothing

でいいと思います。ただし、前提条件として、テーブル「複写先」を作っていないとできませんが。

ご参考までに。


人気Q&Aランキング