よろしくお願いいたします。
エクセルからMYSQLへの命令文を幅をもたせるため、色々といじっています。
i_field = Application.InputBox(フィールド数を入力してください)
ii_field = i_field - 1
Dim field(ii_field)
Dim fbyte(ii_field)
For i = 0 To (ii_field) Step 1
field(i) = Application.InputBox(フィールド名を入力してください)
fbyte(i) = Application.InputBox(フィールド型を入力してください)
Next i
sql = create table & table1 & (
For i = 0 To (ii_field - 1) Step 1
sql = sql & field(i) & fbyte(i) & ,
Next i
sql = sql & field(ii_field) & fbyte(ii_field) & ) type=InnoDB;
上記ソース(間違ってるかも)のように配列数を入力された値にしたいのですが、java
では変数を色々とつかえました。(入力値の配列も)
cでは変数の宣言は最初にしなければならず、配列も定数のみでした。
VBEでも配列は定数のみなんでしょうか?(エラーでは定数式が必要とでました)
それともよい方法があるのでしょうか?
教えてください。
よろしくお願いいたします。
動的配列のことを言いたいのでしょうか?
ReDimステートメントについて調べてみてはどうでしょうか?
また、Collectionオブジェクトもついでに調べてみると良いかも。
ありがとうございます!!
動的配列っていうんですね!
勉強不足ですみません・・・。
Redimは知りませんでした!
Collectionは少しRedimよりは使いこなすのが難しそうなのであとまわしにしました。
すみません!
Redimを使うとコンパイルできましたが、次の段階でとまってしまいました。
i_field = Application.InputBox(フィールド数を入力してください)
ii_field = i_field - 1
ReDim field(ii_field) As Variant
ReDim fbyte(ii_field) As Variant
For i = 0 To ii_field Step 1
field(i) = Application.InputBox(フィールド名を入力してください)
fbyte(i) = Application.InputBox(フィールド型を入力してください)
Next i
iii_field = ii_field - 1
sql = create table & table1 & (
For i = 0 To iii_field Step 1
sql = sql & field(i) & & fbyte(i) & ,
Next i
sql = sql & field(ii_field) & & fbyte(ii_field) & ) type=InnoDB;
cn.Execute sql
デバッグではちゃんとできているみたいなんですが、命令実行となるとエラーになりま
す。
命令文がおかしいんでしょうか?
まず、文字列で扱うならば、String型で宣言してください。
SQL文が動くかどうか知りませんが、以下のようにしてみてはどうでしょうか?
Dim fieldnum As Long
Dim i As Long
Dim fieldname() As String
Dim fieldtype() As String
Dim tablename As String
Dim sql As String
tablename = テーブル
fieldnum = Application.InputBox(フィールド数を入力してください) - 1
ReDim fieldname(fieldnum)
ReDim fieldtype(fieldnum)
For i = LBound(fieldname) To UBound(fieldname)
fieldname(i) = Application.InputBox(フィールド名を入力してください)
fieldtype(i) = Application.InputBox(フィールド型を入力してください)
Next
sql = CREATE TABLE & tablename & (
For i = LBound(fieldname) To UBound(fieldname)
sql = sql & fieldname(i) & & fieldtype(i)
If i <> UBound(fieldname) Then
sql = sql & ,
End If
Next
sql = sql & ) TYPE=InnoDB;
MsgBox sql
ついでに
Dim fieldname() As String
Dim fieldtype() As String
は Typeステートメントを使って
Private Type FieldInfo
Name As String
Type As String
End Type
として、
Dim f() As FieldInfo
ReDim f(3)
f(1).Name = 名前
f(1).Type = VARCHAR ' <-適当
みたいにするとわかりやすいです。
いつもあわてて投稿するので、MYSQLへの実行文にスペースが抜けてたりするので
すいません。
MYSQLは動かなかったのですが、すごく見やすいです!
とくに
MsgBox sql
は確認できて見やすいと思いました。
じっくり考えなくてはと思いつつ、自分の場合ソースを作るとき
・最低限動くようにする。(テーマにそって)
・よりつかいやすいような改良をする。
(思いついたところから)
・ソースの整理(見やすいよう解説や余分なものの削除等)
おおまかに上記のような感じなので、改良をするときももっとブレイクダウンしたほう
が
よいとは思うんですが、使いながらでないと思いつかないもので・・・。
MsgBox sql
は自分だったら最後のほうにならないと思いつきませんでした。
ありがとうございました!
もう少しソースのながれを追ってみます!
ちなみに、VBEのデバッグ機能をつかうと、
下のほうにあるイミディエイトウィンドウや、ローカルウィンドウを使うと便利です。
参考
http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_030_03.html
まぁ、教わるより慣れろだと思います。いろいろ試行錯誤してみてください。
ローカルで値をおっていました。
イミディエイトウィンドウは後回しにしていたんですが勉強します!
便利なサイトを紹介いただいてありがとうございます!
いろいろとありがとうございました。
ちゃんと動きました!!
今日になってPC起動したらソースも何もかも昨日の動かなかったソースのままだったに
もかかわらず、正常に起動していました。
これってPCのほうに問題があったのでしょうか?
それとも・・・??
とりあえずではありますが、今回のテーマも解決とさせていただきます。
今回は色々と使える機能について教えていただきました!!
本当にありがとうございました!!