配列と変数 – プログラミング – Home

通知
すべてクリア

[解決済] 配列と変数


一年生
 一年生
(@一年生)
ゲスト
結合: 18年前
投稿: 37
Topic starter  

よろしくお願いいたします。
エクセルから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でも配列は定数のみなんでしょうか?(エラーでは定数式が必要とでました)
それともよい方法があるのでしょうか?

教えてください。
よろしくお願いいたします。


引用未解決
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

動的配列のことを言いたいのでしょうか?
ReDimステートメントについて調べてみてはどうでしょうか?
また、Collectionオブジェクトもついでに調べてみると良いかも。


返信引用
一年生
 一年生
(@一年生)
ゲスト
結合: 18年前
投稿: 37
Topic starter  

ありがとうございます!!
動的配列っていうんですね!
勉強不足ですみません・・・。

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

デバッグではちゃんとできているみたいなんですが、命令実行となるとエラーになりま
す。
命令文がおかしいんでしょうか?


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

まず、文字列で扱うならば、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 ' <-適当

みたいにするとわかりやすいです。


返信引用
一年生
 一年生
(@一年生)
ゲスト
結合: 18年前
投稿: 37
Topic starter  

いつもあわてて投稿するので、MYSQLへの実行文にスペースが抜けてたりするので
すいません。

MYSQLは動かなかったのですが、すごく見やすいです!
とくに

MsgBox sql

は確認できて見やすいと思いました。

じっくり考えなくてはと思いつつ、自分の場合ソースを作るとき
・最低限動くようにする。(テーマにそって)
・よりつかいやすいような改良をする。
 (思いついたところから)
・ソースの整理(見やすいよう解説や余分なものの削除等)

おおまかに上記のような感じなので、改良をするときももっとブレイクダウンしたほう

よいとは思うんですが、使いながらでないと思いつかないもので・・・。

MsgBox sql

は自分だったら最後のほうにならないと思いつきませんでした。
ありがとうございました!
もう少しソースのながれを追ってみます!


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

ちなみに、VBEのデバッグ機能をつかうと、
下のほうにあるイミディエイトウィンドウや、ローカルウィンドウを使うと便利です。

参考
http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_030_03.html

まぁ、教わるより慣れろだと思います。いろいろ試行錯誤してみてください。


返信引用
一年生
 一年生
(@一年生)
ゲスト
結合: 18年前
投稿: 37
Topic starter  

ローカルで値をおっていました。
イミディエイトウィンドウは後回しにしていたんですが勉強します!
便利なサイトを紹介いただいてありがとうございます!


返信引用
一年生
 一年生
(@一年生)
ゲスト
結合: 18年前
投稿: 37
Topic starter  

いろいろとありがとうございました。

ちゃんと動きました!!

今日になってPC起動したらソースも何もかも昨日の動かなかったソースのままだったに
もかかわらず、正常に起動していました。
これってPCのほうに問題があったのでしょうか?
それとも・・・??

とりあえずではありますが、今回のテーマも解決とさせていただきます。

今回は色々と使える機能について教えていただきました!!
本当にありがとうございました!!


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました