EXCELのワークシートにマクロを登録したボタンを設置して、
mysqlのDBのレコードを更新・登録・削除する事は可能でしょうか?

SQLとかVBAの勉強も兼ねてテスト的に作ってみたいなと思っています。
上手くいけば仕事でも使えればとも思っております。


現在phpmyadminで作成したmydbがあります。
testというテーブルにid,商品名,価格,在庫というようなレコードがあります。

ODBCドライバ等の設定をして、EXCELの外部データの取り込みで、データを取り込む事は
できました。

この取り込んだデータを編集したり、新たに新しい商品を登録して、データベースを更新
できるようにしたいのですが、可能でしょうか?

VBAのサンプルコードなどあればご教示ねがいます。

因みに私のレベルはVBAもmysqlも素人なので、できれば解説などもしていただければ
尚助かります。
よろしくお願い致します。

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

A 回答 (4件)

あれま


.Update

.MoveNext

ではいかがでしょうか?
データの抽出は同様のコードでできましたでしょうか?

オブジェクトが開いている場合は、操作は許可されません
を そのまま理解すると ほかのユーザーがデータベースを開いている いうことになりますが。
ほかのユーザーがデータベースを開いていても抽出はできるはずです。

とりあえず
On Error GoTo Err
の行を無効にして どこで エラーになっているか確認されてはいかがでしょうか?
もし
rs.Open Sql, con, adOpenStatic, adLockOptimistic
あるいは
.Update
あたりでは?
同じ状況が確認できる環境ではありませんので、確実な回答ができません。
    • good
    • 0
この回答へのお礼

ありがとうございます。

.MoveNext
を試してみましたがダメでした。

On Error GoTo Err
をコメントアウトしてエラーを確認してみるとご指摘通り

rs.Open Sql, con, adOpenStatic, adLockOptimistic
の行がエラーになっていました。

試しにコメントアウトして
'rs.Open Sql, con, adOpenStatic, adLockOptimistic

にしてみると、ちょっとだけ先に進むのですが、
!ID = Cells(i, 1).Value

のところでエラーになり、

現在の Recordset は更新をサポートしていません。
プロバイダか、選択されたロックタイプの限界の可能性があります。

というメッセージになります。

ロックタイプを指定してみたらいいのかなと思い
con.Open connectionString

のところに追記で
con.Open connectionString, adOpenStatic, adLockOptimistic

という風にしてみると
access denied for user ''@'localhost' using password yes

と、パスワードが違いますよというようなメッセージになってしまいます。


お手上げでしょうか。。。?

お礼日時:2011/04/26 13:09

別案ですが


SQL文でできるかもしれません。
con.Execute ("Update costomer Set 氏名='山田' Where 会員番号='1000'")
とかで実行してみてはいかがでしょうか?

For i = 2 To Cells(1, 1).CurrentRegion.Rows.Count
!会員番号 = Cells(i, 1).Value
!氏名 = Cells(i, 2).Value
!電話番号 = Cells(i, 3).Value
!住所 = Cells(i, 4).Value
.Update
Next i
の部分を
For i = 2 To Cells(1, 1).CurrentRegion.Rows.Count
NyID=Cells(i, 1).Value
MeMess= Cells(i, 2).Value
con.Execute ("Update costomer Set 氏名='" & MyMess & "' Where 会員番号='" & MyID & "'")
MyMess = Cells(i, 3).Value
con.Execute ("Update costomer Set 電話番号='" & MyMess & "' Where 会員番号='" & MyID & "'")
MyMess = Cells(i, 4).Value
con.Execute ("Update costomer Set 住所='" & MyMess & "' Where 会員番号='" & MyID & "'")
Next i
といった感じでしょうか?
重複しない会員番号があって、会員番号は変更しないという条件になりますが。
SQL文に強い人であればほかの書き方もあると思います。
ちなみにSQL Serverでは 更新できました。
ちなみに 追加は Insert 削除は Delete で可能です・
    • good
    • 0

難しそうですね。


できないことはないと思いますが
MySqlについての情報って調べてみましたが私も該当するような
サイトが見つかりませんでした。
ちなみにAccessではできています。
でも仮にできたとしても追加と削除は運用であまり気にしたくても
大丈夫でしょうが、
データの内容を更新するとしたら、抽出したデータと更新する内容が
常に一致する条件が必要ですので複数のユーザーでひとつのデータベースを
活用する場合は注意が必要です。
でも
同じような方法でデータの抽出はできているのですよね。
近いところまで来ていると思います。
ちょっとほかのサイトで質問してはいかがでしょうか。
結果については、私もちょっと興味があります。

http://www.moug.net/
などではいかがでしょうか?
お力になることができずごめんなさいです。
    • good
    • 0

現在のコードを提示してもらうと回答が付きやすいかと思います。


たぶん、今は
http://www.cocoaliz.com/excelVBA/index/40/
で紹介されているような Recoredsetを使って データベースの内容を
エクセルに抽出、表示できた所だと想定して回答いたします。
ちょっと検索しましたがmysplの場合の

>この取り込んだデータを編集したり、新たに新しい商品を登録して、データベースを更新
について見かけませんでしたので Accessの場合ですが
データを新しく登録する場合の例がありました。
http://www.moug.net/tech/exvba/0150040.htm

この取り込んだデータをエクセルで編集し、データベースの内容を置き換える場合は
上記のサイトの
.AddNew
!伝票番号 = Cells(i, 1).Value
!日付 = Cells(i, 2).Value
!コード = Cells(i, 3).Value
!得意先 = Cells(i, 4).Value
!金額 = Cells(i, 5).Value
.Update
の .AddNew を抜いたコードで考えてみてください。
修正の場合は、エクセルに抽出したデータが編集中にほかのユーザーで変更されないことなど
注意して使うことになります。
エクセルのシートの上には
抽出のボタンと抽出した内容を編集後に、データベースの内容を置き換えるボタンをおいて活用しています。

参考までに
http://www.moug.net/tech/exvba/0150041.htm
データを削除する場合のサンプルがあります。
    • good
    • 0
この回答へのお礼

ご回答いただき、ありがとうございます。

早速
http://www.moug.net/tech/exvba/0150040.htm
の分のサンプルコードを参考にして、下記のような形にしました。


Sub 追加()
Dim con As ADODB.Connection
Dim rs As ADODB.Recordset
Dim connectionString As String
Dim sqlStr As String

'接続文字列
connectionString = "Driver={MySQL ODBC 5.1 DRIVER};" _
& " SERVER=localhost;" _
& " DATABASE=torys;" _
& " USER=root;" _
& " PASSWORD=;"

'ADODB.Connection生成
Set con = New ADODB.Connection
On Error GoTo Err

'MySQLに接続
con.Open connectionString

'SQL文
sqlStr = "select * from customer"

'SQL文実行
Set rs = con.Execute(sqlStr)
rs.Open Sql, con, adOpenStatic, adLockOptimistic
With rs 'シートの項目行(1行目)を除いてデータ行数分ループ
For i = 2 To Cells(1, 1).CurrentRegion.Rows.Count
!会員番号 = Cells(i, 1).Value
!氏名 = Cells(i, 2).Value
!電話番号 = Cells(i, 3).Value
!住所 = Cells(i, 4).Value
.Update
Next i
End With

'クローズ
con.Close
Set rs = Nothing
Set con = Nothing
Exit Sub
Err:
Set rs = Nothing
Set con = Nothing
MsgBox (Err.Description)
End Sub

すると、
「オブジェクトが開いている場合は、操作は許可されません」
というメッセージが表示されます。

どこが問題でしょうか…

どんくさい質問で申し訳ありません。

お礼日時:2011/04/25 13:23

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

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

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

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

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

QMySQLにEXCELやCSVなどでの一括登録

レンタルサーバー上のMySQLにローカル上のEXCELで作成するデータを登録しようとしています。
過去ログ等を調べたのですが、自分で質問することにしました。
http://oshiete1.goo.ne.jp/qa1244588.html

MySQLとPHPでwebに公開するサイトを作っています。
データベースはphpMyAdminより操作しています。

データ登録時なのですが、登録する項目(フィールド)と、件数(レコード)が多いので、
phpMyAdminだと一度に登録できるのが、2件とブラウザ上での作業になるので、
間違いや、確認等の効率がかなり悪くなります。
エクスポートでEXCELやXML、CSVなどがあるので、インポートでも使えるのではないかと考えました。
そこで過去ログやweb上で情報を探し、CSVなどをインポートしてみたのですが、エラーが表示されます。

過去ログで見つけました、ODBCドライバというのは必要なのでしょうか。
またそれはレンタルサーバーでも使用可能なのでしょうか。

EXCELなどのソフトを使って、ローカル上でデータを作成・管理したいと考えています。
何か良い方法はないでしょうか。

環境:
Mac OSX.4  (基本Macで作業しています)
Windows XP sp2

レンタルサーバ:
MySQL 4.1.10a
phpMyAdmin 2.6.4-pl4
PHP4(ver.4.3.8)

宜しくお願いします。

レンタルサーバー上のMySQLにローカル上のEXCELで作成するデータを登録しようとしています。
過去ログ等を調べたのですが、自分で質問することにしました。
http://oshiete1.goo.ne.jp/qa1244588.html

MySQLとPHPでwebに公開するサイトを作っています。
データベースはphpMyAdminより操作しています。

データ登録時なのですが、登録する項目(フィールド)と、件数(レコード)が多いので、
phpMyAdminだと一度に登録できるのが、2件とブラウザ上での作業になるので、
間違いや、確認等の効率がかなり悪く...続きを読む

Aベストアンサー

しばらくアクセスできなかったので、だいぶ日が経ってしまいましたが、まだみてますか?

>1.excelから csv形式で保存
このcsv中にtableの全行のデータがあるなら、

>6.load 用のsql文実行 (全行追加)
この前に、table内の全行削除「DELETE FROM table_name」をしてから、全行追加すれば、全行置き換えになります。

>phpは少し触れます。
失礼しました。
phpで全自動化を行うなら、csvデータの量にもよるけど、
アップロードフォームに<textarea> でcsvの内容を入れて送信。量が多ければ、<input type="file">を使用。
受信側では、<textarea name="csv">のデータ$_POST["csv"]をMySQLデータ領域にcsvファイルとして書き出したのち、
「ファイル書き込みは、PHPマニュアルのint file_put_contents ( string filename, string data [, int flags [, resource context]]) あたりの関数をチェック」
MySQLに接続して、「接続方法はPHPマニュアルのMySQL関連関数を熟読のこと」
table内の全行削除のSQL文とload 用のsql文とを実行
と言う手順になるかな。
一遍に作ろうとせず、一つ一つ実行確認しながら組み上げていくとよいです。

参考URL:http://jp.php.net/manual/ja/

しばらくアクセスできなかったので、だいぶ日が経ってしまいましたが、まだみてますか?

>1.excelから csv形式で保存
このcsv中にtableの全行のデータがあるなら、

>6.load 用のsql文実行 (全行追加)
この前に、table内の全行削除「DELETE FROM table_name」をしてから、全行追加すれば、全行置き換えになります。

>phpは少し触れます。
失礼しました。
phpで全自動化を行うなら、csvデータの量にもよるけど、
アップロードフォームに<textarea> でcsvの内容を入れて送信。量が多ければ...続きを読む

Q別のシートから値を取得するとき

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

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

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

Aベストアンサー

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

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

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

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

Aベストアンサー

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

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

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【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 

QVBとアクセスでSQL文に変数を使いたいのですが

したいことはレコードの挿入をSQL文で変数を使用して処理したいのですがうまく動作してくれません

StrSQL_1 = _
"insert into 行先情報テーブル (社員ID, 行先, 帰社予定時刻, 備考)" & _
"values (7,'(変数1)','(変数2)','(変数3)')"

変数の部分が置き換わりません、いろいろ調べてみたのですがどうもわかりませんvaluesでは変数を使えないのでしょうか?

もしそうだとするとどのようにすればレコードを挿入するSQL文で変数を利用できるのかをおしえていただけないでしょうか

Aベストアンサー

文字列なんで、&で連結すればOKです。

StrSQL_1 = _
"insert into 行先情報テーブル (社員ID, 行先, 帰社予定時刻, 備考)" & _
"values (7,'" & 変数1 & "','" & 変数2 & "','" &(変数3)& "')"

QEXCEL VBAで全選択範囲の解除

EXCEL VBAで
Cells.Select
と書くと、全セルが選択状態になりますが、
これを解除するには、どう書けばよいのでしょうか?

Aベストアンサー

その1
A1 など、適当なセルを選択する。
(回答#1と同じ)

その2
全選択する前の選択範囲に戻る。

全選択前に
変数 = Selection.Address で記憶

全選択後
Range(変数).Select で元の選択範囲を選択

Qテーブルの最後(最新)のレコードを抽出したい

宜しくお願いします。
PHP MYSQL の組み合わせで使っています

以下のようにして、最後のレコードを取り出したいのですが
まったく違う事をしているのかもしれません。

$sql =" select * from テーブル where フィールド='max' " ;

フィールドはauto_incrementで番号を振っています。
これで最大のつもりなのですが・・・。

他にも、レコードを入れた時間も記録したフィールドがあるのですが
どうしてよいか?判りません。

テーブルの最新のレコードを出したいのです。
**その中の一つのフィールドを取り出すのですが、
  それはうまくいっているみたいです 
  (max の所に数字を入れると表示します)

お手数かけますが、どなたかご教授お願いいたします。

Aベストアンサー

#2回答者です。

MySQL 4.1以前(サブクエリを使えない)なら、以下のような方法が考えられます。

select * from 表名
order by 列名 desc limit 1

QFunctionの戻り値を配列にしたいのですが

vbを始めたばかりですがよろしくお願いします。

Functionの戻り値を配列にしたいのですが

Function fnc(ByVal a As Byte, ByVal b As Byte) As Integer()
fnc(0) = a + b
fnc(1) = a - b
End Function
というような使い方はできないのでしょうか?
一つのFunctionで二つの計算結果をかえすには
どうしたらよいのでしょうか?
お願いします。

Aベストアンサー

ローカル変数を使えば可能だと思いますよ

VB6.0の場合
Function fnc( byVal a as Byte, Byval b as Byte) as Integer
  dim ar(1) as Integer
  ar(0) = a + b
  ar(1) = a - b
  fnc = ar
End Function

VB.NETなら
Function fnc( byVal a as Byte, Byval b as Byte) as Integer
  dim ar(1) as Integer
  ar(0) = a + b
  ar(1) = a - b
  return ar
End Function

VB.NETでも fnc = ar と言った記述も出来ます

呼び出し側では 動的配列として返り値を受けます
dim results() as Integer
results = fnc( 5, 3 )
と言った具合です

QODBCで接続するとDBに変更/追加出来ない。

SQLServerのフロントエンドとしてACCESSを使用しDBを参照しています。
SQLServerには、5つのテーブルを用意しています。
1つのテーブルは変更も追加も出来るのですが他のテーブルが参照のみとなってしまって困っています。
何が問題なのか、ご存知の方教えて頂けますでしょうか。

環境
SQLServer2005Express
Access2002

よろしくお願いします。

Aベストアンサー

リンクテーブルならば、更新できないテーブルに主キーを設定していますか?または、主キーを指定してリンクしましたか?


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

人気Q&Aランキング

おすすめ情報