【最大10000ポイント】当たる!!質問投稿キャンペーン!

●質問の主旨

WorkSheet(1)(「柴田8月分」)にユーザーフォームを固定的に
表示させつつ、WorkSheet(1)以降のWorkSheet(2)、
WorkSheet(3)、WorkSheet(4)の表を参照しながら
ComboBox1、ComboBox2、ComboBox3にリストを
選択して、データベースに入力したいと考えています。

以下のコードをどのように書き換えれば良いでしょうか?
ご教示のほどよろしくお願い申し上げます。

●質問の補足

現在のコードでは、ComboBox1、ComboBox2、ComboBox3を
それぞれ選択しているとユーザーフォームがそれぞれ
WorkSheet(2)、WorkSheet(1)(顧客リスト)、WorkSheet(3)(社員名)、
WorkSheet(4)(大分類)にとんでしまいます。
転記入力が終了すると、また手作業でWorkSheet(1)に戻らなければなりません。
その手作業を回避したいと考えています。

なお添付画像はComboBox1の選択前なのでWorkSheet(1)
に留まってくれています。

●コード
Option Explicit

'ユーザーフォームの初期化
Private Sub UserForm_Initialize()

Dim r As Range
Dim n As Range
Dim d As Range

With Worksheets(2)

Set r = .Range("C3", .Cells(.Rows.Count, 2).End(xlUp))

End With

With Me.ComboBox1
.ColumnCount = 2
.ColumnWidths = ";0"
.List = r.Value
End With

With Worksheets(3)

Set n = .Range("C3", .Cells(.Rows.Count, 2).End(xlUp))

End With

With Me.ComboBox2
.ColumnCount = 2
.ColumnWidths = ";0"
.List = n.Value
End With

With Worksheets(4)

Set d = .Range("C3", .Cells(.Rows.Count, 2).End(xlUp))

End With

With Me.ComboBox3
.ColumnCount = 2
.ColumnWidths = ";0"
.List = d.Value
End With

Set r = Nothing
Set n = Nothing
Set d = Nothing

TextBox3.Value = Worksheets(1).Range("A2").Value + 1
txtdate = Date
OptionButton1.Value = True

End Sub

'ComboBox1をクリックしたときの処理
Private Sub ComboBox1_Click()

Worksheets(2).Select
With Me.ComboBox1
Me.Label19.Caption = .List(.ListIndex, 1)
Worksheets(2).Select Replace:=False

End With

End Sub

'ComboBox2をクリックしたときの処理
Private Sub ComboBox2_Click()

Worksheets(3).Select
With Me.ComboBox2
Me.Label20.Caption = .List(.ListIndex, 1)
Worksheets(3).Select Replace:=False

End With

End Sub

'フォームからデータベースへの転記
Private Sub CommandButton3_Click()

Dim Rowpos As Long
Dim ColPos As Long

Rowpos = Worksheets("柴田8月分").Range("a10000").End(xlUp).Row
ColPos = 1

Rowpos = Rowpos + 1

With Worksheets("柴田8月分")

.Cells(Rowpos, ColPos) = TextBox3.Value
.Cells(Rowpos, ColPos + 1) = txtdate.Value
.Cells(Rowpos, ColPos + 2) = Label19.Caption
.Cells(Rowpos, ColPos + 3) = ComboBox1.Text
.Cells(Rowpos, ColPos + 4) = ComboBox2.Text
.Cells(Rowpos, ColPos + 5) = Label20.Caption
.Cells(Rowpos, ColPos + 6) = ComboBox3.Text

End With

'Noの加算
Dim i As Long


For i = 1 To 1 Step 1
TextBox3.Value = TextBox3.Value + 1

Next

Call Clearcmb

End Sub

'データベース入力後にコンボボックスを空欄にする
Private Sub Clearcmb()

ComboBox1.Text = ""
ComboBox2.Text = ""
ComboBox3.Text = ""


End Sub

'ユーザーフォームの終了
Private Sub CommandButton5_Click()

Unload UserForm1
End

End Sub

以上よろしくお願い申し上げます。使用機種はWindowsVistaで、
Excel2007です。私はVBA初心者です。

「ユーザーフォームをWorkSheet(1」の質問画像

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

A 回答 (1件)

>'ComboBox1をクリックしたときの処理


>'ComboBox2をクリックしたときの処理
それぞれ
Worksheets(xx).Select
Worksheets(xx).Select Replace:=False
この箇所のシート選択を削れば良いです。

それによって他のコード箇所に
Range("A1").Value = ...
など、Rangeの親が指定されていない箇所があれば、
それはActivesheetに対するRangeになってしまいますので
Worksheets(xx).Range("A1")...
..というようにWorksheetから指定するようにしてください。
    • good
    • 0
この回答へのお礼

end-u様

昨日に引き続きご回答ありがとうございます。
ご指導の通り、

Worksheets(xx).Select
Worksheets(xx).Select Replace:=False

の部分を削除すると、フォームがWorksheets(1)に
固定された状態でComboBoxを選択できるようになりました。

>Worksheets(xx).Range("A1")...
>..というようにWorksheetから指定するようにしてください。

今後このデータベースはまだいくつか機能を足して
行くつもりなので上記のアドバイスも心がけるようにします。

お礼日時:2011/06/30 17:34

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

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

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

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

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

QVBA(エクセル)のユーザーフォームの固定

VBAのユーザーフォームを初めに表示した位置から、動かせないようにするためにはどうしたらよいでしょうか。Moveableのプロパティもないようです。よろしくお願いします。

Aベストアンサー

Private Sub UserForm_Layout()
UserForm1.Left = 0
UserForm1.Top = 0
End Sub

で、似たような状態になります。
数字のゼロは表示したい場所により、変更して下さい。

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。

Qユーザーフォームを表示中にシートの操作をさせるには

ユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。
セルへの入力、画面のスクロールなどは、ユーザーフォームからマクロを実行させたり、.hideでユーザーフォームを一時的に隠すなどすればいいのでしょうが、そういう手段をとらないでユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。

Aベストアンサー

ユーザフォームの
ShowModalプロパティを
falseにすればよいかと。

QExcel VBA で、マクロを実行した時のフォームを固定する方法

Excel VBA で、マクロを実行した時のフォームを固定し、移動できないようにする方法を教えてください。
画面一杯にして、最小化も含め指示したフォームのみの表示で他の操作をできないようにしたいと思っておりますが、どのようにしたらいいか教えてください。

Aベストアンサー

フォームではないけど

Sub test2()
With Application
'.DisplayFullScreen = True
.DisplayFormulaBar = False
.DisplayStatusBar = False
End With
ActiveWindow.DisplayWorkbookTabs = False
For Each CB In Application.CommandBars
CB.Enabled = False
Next CB

MsgBox "フォームじゃないけど、こんな感じです。"

With Application
'.DisplayFullScreen = False
.DisplayFormulaBar = True
.DisplayStatusBar = True
End With
ActiveWindow.DisplayWorkbookTabs = True
For Each CB In Application.CommandBars
CB.Enabled = True
Next CB
End Sub

フォームではないけど

Sub test2()
With Application
'.DisplayFullScreen = True
.DisplayFormulaBar = False
.DisplayStatusBar = False
End With
ActiveWindow.DisplayWorkbookTabs = False
For Each CB In Application.CommandBars
CB.Enabled = False
Next CB

MsgBox "フォームじゃないけど、こんな感じです。"

With Application
'.DisplayFullScreen = False
.DisplayFormulaBar = True
.DisplayStatusBar = True
End With
ActiveWindow.DisplayWorkbookTabs = True
For Each CB In...続きを読む

QエクセルVBAでテキストボックスの値の取得と変更について

エクセルのVBAを使ってシート上のテキストボックスのテキストを取得・変更するマクロを作成したいと思っていますがうまく行きませんので、お知恵を拝借したいとおもいます。

環境:WindowsXPでオフィス2002
状況:
エクセルブックa.xlsのシートに「コントロールツールボックス」のテキストボックスを配置(オブジェクト名はTEXTBOX_C)
エクセルブックb.xlsにコードを書き、a.xlsのTEXTBOX_CのプロパティのValueかTextを取りだしたい

試した事:
コントロールを配置したシートに次のマクロ
TEXTBOX_C.Text = "これはコントロールのテキストボックス"
を書くとテキストボックスに文字を入れ込めますが、別のエクセルブックからだと上手く行きません。

また、オートシェイプのテキストボックスの場合は簡単に出きるのですが、コントロールツールボックスではどうしても上手く行きませんので、対象法などご存知の方いらっしゃいましたら教えてください

Aベストアンサー

エクセルを新規に開きました。
そのSheet1に(コントロールツールボックスの)TextBoxを貼りつけました。
そのBook1から、ファイル-開くで別ブックを開きました。
別ブックのMojule1側に下記を書いて
Sub test02()
MsgBox Workbooks("book1").Worksheets("sheet1").textbox1.Text
End Sub
を実行すると、Book1のTextBoxに入れた文字列が表示
されました。
がそんな質問ではないのですか。

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

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

Aベストアンサー

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

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

QExcelでマクロ実行中に画面を固定する方法

Excelでマクロ(VBA)を実行しているとお考えください。
内容は他のシートのデータを別のシートにコピー&ペーストするとお考えください。
すると、画面がめまぐるしく動きます。
これをとめる方法をご存知の方教えていただければうれしいです。
(以前、やったことがあるんですが、忘れてしまいました)
(また、検索で調べようとしたのですが、どのようなキーワードで検索すればいいのかわかりませんでした(私のキーワードでは見つかりませんでした))
よろしくお願いいたします。

Aベストアンサー

はじめまして.

以下のコマンドでできると思いますよ。

マクロの最初に
Application.ScreenUpdating = False '画面更新抑止
を入れて、

マクロの最後に
Application.ScreenUpdating = True '画面を更新
を入れる。

こんなのでどうでしょう!?
では。

QエクセルVBAのIf,Then 構文でOr条件とAnd条件の結合方法?

ワークシート関数で書けば
=IF(OR(F18=0,AND(F15>0,F16>0)),TRUE)です。
これをVBAで書こうとして

If Sheet1.Range("F18") = 0 Or Sheet1.Range("F15") > 0 And Sheet1.Range("F16") > 0 Then
MsgBox True
Else
MsgBox False
End If

とやってみたのですが、正しくないようです。
どのように書けばいいのでしょうか?

Aベストアンサー

>とやってみたのですが、正しくないようです。

式は正しいと思いますよ

ANDとORは、ANDが先に演算されます。/*と+-では、/*が先に演算されるようなものです。

でも、わかり易くするために、#1のかたのように括弧をつけるほうが良いですね。

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

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

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

Qエクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?

エクセルのVBAでユーザーフォームの中に
テキストボックスとラベルがあります。

ラベルの縦幅とテキストボックスの縦幅は
同じです。(文字1行分くらい)

そのテキストボックスの左隣にラベルを置いて、
項目名的なものを表示させたいと思うのですが
ラベルの値が上に寄っているので、垂直方向に
中央揃えさせたいのですが、設定の仕方が
分からず困っています。

ちなみにエクセルはXPで、VBAは詳しくありません。
詳しくないけど調べながらちょっとずついろいろ
作業しています。

どうぞよろしくお願いします。

Aベストアンサー

文字の上下中央設定は、確かにできませんね。
代案ですが、次のような操作はいかがでしょうか。

1.双方を選択した状態でプロパティを表示し、AutuSize の値を True にする。
2.前回のようにコントロールの位置を上下中央で揃える。
3.各コントロールの長さ(幅)や文字サイズを調整する。


人気Q&Aランキング