痔になりやすい生活習慣とは?

いつもお世話になります。お知恵を貸してください。
ユーザーフォームにコンボボックスがあります。
リストの中身はプロパティウィンドウのRowSourceでSheetにある時間表を指定しています。
そのリストは7:00,7:30,8:00…と時刻をh:mmで表示してあります。
コンボボックスには7:00と表示されているのですが、実際選ぶとシリアル値で表示されてしまいます。
[終了時間]-[開始時間]の計算もしたいので、シリアル値は必要だと思いますが、表示はh:mmで表示する方法を教えてください。
よろしくお願いします。

※添付画像が削除されました。

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

A 回答 (7件)

ついでに、入力チェックや入力補助機能なども含めたサンプル。



1. フォームに ComboBox1、CommandButton1 を配置する
2. Sheet1のA1:A20に RowSource に設定するデータを入力する
3. 以下のソースをフォームにペーストにテスト

Option Explicit

' // フォームを閉じる場合のフラグ
Private m_fFormClose As Boolean

' // Userform が初期化される時実行されるイベント
'
Private Sub UserForm_Initialize()
  
  With Me.ComboBox1
    .List = Application.Text(Range("Sheet1!A1:A20").Value, "h:mm")
    ' IME を無効化し全角文字などが入力されないようにする
    .IMEMode = fmIMEModeDisable
    ' 最大5文字までしか入力できなくする
    .MaxLength = 5
  End With

End Sub

' // Userform を閉じる時実行されるイベント
'
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  m_fFormClose = True
End Sub

' // ComboBox がフォーカスを失うとき実行されるイベント
'
Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  
  ' フォームを閉じるフラグが立っている場合、即終了
  If m_fFormClose Then Exit Sub
  
  Dim s As String
  s = Trim$(ComboBox1.Text)
  If Len(s) Then
    ' 時刻以外が入力されたらフォーカス遷移をキャンセルさせる
    Cancel = Not IsTime(s)
  End If

End Sub

' // ComboBox キーが押されたとき実行されるイベント
' // ANSI コードまたはシフト JIS コードに対応する文字キーで発生
'
Private Sub ComboBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  
  ' 時刻入力のため以外のキー入力以外は無効化する
  If Not Chr(KeyAscii) Like "[0-9:]" Then
    KeyAscii = 0
  End If
  
End Sub

' // ComboBox キーが押されれ、キーを離したとき実行されるイベント
'
Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  
  ' 以下は ComboBox のマッチング機能を利用し、「:」記号の入力を
  ' スキップさせる入力補助を行う
  
  If KeyCode <> vbKeyBack Then ' BackSpace キーは除外
    If Me.ComboBox1.SelText Like ":*" Then
      Me.ComboBox1.SelStart = Me.ComboBox1.SelStart + 1
      Me.ComboBox1.SelLength = 2
    End If
  End If
  
End Sub

' // CommandButton をクリックしたとき実行されるイベント
'
Private Sub CommandButton1_Click()
  ' C1 セルへ記入
  With Cells(1, "C")
    .NumberFormat = "h:mm"
    .Value = CDate(Me.ComboBox1.Value)
  End With
End Sub

' // 内部チェック関数-時刻書式
'
Private Function IsTime(ByVal s As String) As Boolean
  
  If IsDate(s) And (s Like "#:##" Or s Like "##:##") Then
    IsTime = True
  Else
    MsgBox "時刻を入力して下さい", vbCritical
  End If

End Function

この回答への補足

KenKen_SP様
遅くなりましたが、実行してみました。
とてもすごいです!!
自分で時間の引き算も足してみました。
' // ComboBox2 がフォーカスを失うとき実行されるイベント
'
Private Sub ComboBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)

' フォームを閉じるフラグが立っている場合、即終了
If m_fFormClose Then Exit Sub

Dim s As String
s = Trim$(ComboBox2.Text)
If Len(s) Then
' 時刻以外が入力されたらフォーカス遷移をキャンセルさせる
Cancel = Not IsTime(s)
End If
’自分で足したところ
TextBox1.Text = Format((TimeValue(ComboBox2.Text) - TimeValue(ComboBox1.Text)), "h:mm")

End Sub
私の考えていたような動きになっているようです。
本当に助かりました。またご縁がありましたらよろしくお願いします。

補足日時:2009/08/14 20:21
    • good
    • 1
この回答へのお礼

KenKen_SP様
ご丁寧なご回答ありがとうございます。
今晩にでも試してみようと思います。
私は参考書を片手に意味を考えながらやっておりますので
時間がかかります。
本当に助かります。ありがとうございます。
それにしても同じ様な動きでもやり方がいろいろあるのですね。
勉強になります。

お礼日時:2009/08/03 07:55

私が


Private Sub ComboBox3_Change()
ではなく、
Private Sub ComboBox3_AfterUpdate()
を使用した理由を説明していませんでした。

Changeでは、1字入力するごとにプログラムが起動してしまいます。
そのためにプログラムが思うように動いていないのだと思います。

一通り入力を終えて、確定した時点で始めてプログラムを実行するために「AfterUpdate」を使用しました。


Private Sub ComboBox1_AfterUpdate()
MsgBox "Update"
End Sub

Private Sub ComboBox1_Change()
MsgBox "Change"
End Sub
の違いを試してください。
両方いっぺんに設定すると分かりにくいので、片方ずつ設定してみてください。

この回答への補足

rukuku様こんにちは。
AfterUpdateとChangeの違いを感じてみました。なるほでです。
先日の返答が他の方への返答が入ってしまっていました。大変失礼しました。
(1)やはり引き算がうまくできません。

(2)
Private Sub ComboBox3_AfterUpdate()
If IsDate(ComboBox3) Then MsgBox = TimeValue(ComboBox3)
End Sub
これを実行すると「代入式の左辺の関数呼び出しは、バリアント
型またはオブジェクト型の値を返さなければなりません」と
メッセージがでます。
お時間がありましたらよろしくお願いします。

補足日時:2009/08/05 07:16
    • good
    • 0
この回答へのお礼

rukuku様
丁寧にご説明頂き本当にありがとうございます。
のちほど試してみようと思います。
こちらも参考書を片手に意味を調べながら実行しておりますが、
なかなか??です。
がんばります。

お礼日時:2009/08/03 07:50

レス遅くなりました。

#2 はボツの方向で。

RowSource を使うとこういう部分が面倒ですね・・ComboBox にアイテムを
セットするには、RowSource の他、

  ・List プロパティー
  ・AddItem メソッド

といった方法もあります。次は、List プロパティーを使った例です。

Private Sub UserForm_Initialize()

  ComboBox1.List = Application.Text(Range("Sheet1!A1:A20").Value, "h:mm")

End Sub

これなら、わざわざ Change イベントで書式化する必要はありません。
なぜなら最初から書式化した「文字列」をセットしているのですから。

そもそも、TextBox や ComboBox、ListBox などのコントロールの値は
文字列です。それを四則演算したい場合は、数値なりシリアル値として
変換してやらねばなりません。例えば、補足にある

  「ComboBox2 - ComboBox1」

という計算を時刻の引き算をしたいなら、

  TimeValue(ComboBox2.Text) - TimeValue(ComboBox1.Text)

とします。

私は、RowSource プロパティーは全く使わないので詳しくありませんが、
どうもセル参照のようですね。。データのコピーを ComboBox にセット
するのではなく、セルへリンクが張られてるような感じかと。
数値やシリアル値の場合、面倒そうなので 上記 List プロパティーか、
AddItem の方向で検討してみてください。
    • good
    • 0

>ただ、リストに無い時間(例えば13:15)が手入力できません。


>入力できるようにする方法はありますか?

コンボボックスの、MatchRequired が Trueになっていませんか?
これがTrueになっていると、リストにない値は入力できません。

時刻として認識できる形式で入力されれば、シリアル値として扱うこともできます。以下のコードを試してみてください。
Private Sub ComboBox3_AfterUpdate()
If IsDate(ComboBox3) Then MsgBox = TimeValue(ComboBox3)
End Sub
    • good
    • 0
この回答へのお礼

rukuku様、度々ありがとうございます。
>ただ、リストに無い時間(例えば13:15)が手入力できません。
>入力できるようにする方法はありますか?

は .Style = fmStyleDropDownList を fmStyleDropDownComboに変えたら入力できるようになりました。
ただ、カーソルは入るのですが、数字がうまく入力できません。
1文字目が変になりその後もうまく入力できません。

引き算の方は
Private Sub ComboBox1_Change()
' 値が変更される度に書式を変更する
On Error Resume Next
ComboBox1.Value = Format$(ComboBox1.Value, "h:mm")
End Sub
で文字列になってしまう(?)ので
ComboBox1.Value = Format$(ComboBox1.Value, "h:mm")
のコードを抜くと計算できます。
初心者に毛が生えた程度の私には難しいようです。
作りたいユーザーフォームはイメージできているのですが
VBAを作ることは難しいです。

お礼日時:2009/08/01 18:01

>ComboBox2もComboBox1と同じように作り


>ListBox1に ComboBox2 - ComboBox1 (引き算)
>を自動表示したい場合のListBox1の
>Private Sub ListBox1_Change()はどのようになりますでしょうか?

リストボックスのイベントからは、コンボボックスのchangeは拾えません。コンボボックスのchangeを使います。

Private Sub ComboBox1_Change()
ListBox1.Value = ComboBox2 - ComboBox1
End Sub

Private Sub ComboBox2_Change()
ListBox1.Value = ComboBox2 - ComboBox1
End Sub
    • good
    • 0

Change イベントで書式化するとか。

以下、新規でのスモールサンプル。

1. フォームに ComboBox1、CommandButton1 を配置する
2. Sheet1のA1:A20に RowSource に設定するデータを入力する
3. 以下のソースをフォームにペーストにテスト

Private Sub UserForm_Initialize()
  With Me.ComboBox1
    .RowSource = "Sheet1!A1:A19"
    .Style = fmStyleDropDownList
  End With
End Sub

Private Sub ComboBox1_Change()
  ' 値が変更される度に書式を変更する
  On Error Resume Next
  Me.ComboBox1.Value = Format$(Me.ComboBox1.Value, "h:mm")
End Sub

Private Sub CommandButton1_Click()
  ' C1 セルへ記入
  With Cells(1, "C")
    .NumberFormat = "h:mm"
    .Value = Me.ComboBox1.Value
  End With
End Sub

この回答への補足

KenKen_SP様 ありがとうございます。
希望通り表示できました。
ただ、リストに無い時間(例えば13:15)が手入力できません。
入力できるようにする方法はありますか?
よろしくお願いします。

補足日時:2009/07/31 23:24
    • good
    • 0

こんばんは



Excelのバージョンを教えてください。

手元にある2000で探してみた結果、「表示形式」のようなプロパティはなさそうです。後のバージョンで追加されたかどうかは確認していません。

しかし、バージョン2000でも、「表示」と「実際の計算に使う値」を分けることができます。

以下のことを試してみてください
1. Sheet1に以下のように入力
     A     B
  1  零時   0:00
  2  六時   6:00
  3  十二時  12:00
  4  十八時  18:00

2.コンボボックスのプロパティを以下のように設定
  RowSource → Sheet1!A1:B7
  BoundColumn → 2

3.コンボボックスのあるフォームのコードに下記を記述
  Private Sub ComboBox1_Change()
   MsgBox ComboBox1.Value
  End Sub

これを使えば、コンボボックスには時刻形式で表示しつつ、計算ではシリアル値を使うことができます。すなわち、左側の列を表示用、右側の列を計算用に使います。(表示用の時刻には「’」をつけておきます。)

この回答への補足

rukuku様 ありがとうございます。
エクセル2000です。無事に表示できました。
さらに質問で恐縮ですが、ComboBox2もComboBox1と同じように作り
ListBox1に ComboBox2 - ComboBox1 (引き算)
を自動表示したい場合のListBox1の
Private Sub ListBox1_Change()はどのようになりますでしょうか?

もしご存知でしたらよろしくご教授ください。

補足日時:2009/07/31 22:42
    • good
    • 0

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

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

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

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

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

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

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

Aベストアンサー

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

Qフォームテキストボックスの表示設定

Excelシートとユーザーフォームのテキストボックスを、
ConntrolSourceで連動させ表示させています。
この時、セルの表示は、時刻表示させ、時間単位の計算を行っていますが、フォームの表示が、時刻表とならず、0.5などと表示されてしまいます。フォームからの入力は、時刻入力してもセルへは、正常に時刻単位で入力できます。
フォームの、表示を時刻単位で表示するには、どうしたらよいのか、教えてください。VBA超初心者で、困り果てています。
よろしくお願いします。

Aベストアンサー

#01です。補足ありがとうございました
まず先の回答を理解するために新規のブックにユーザフォームとテキストボックスを1つ配置して、ユーザーフォームのモジュールシート(VBE画面でユーザーフォームをダブルクリックすると開くシート)に#01のVBAを貼り付けて動作を確認してください。

その上で、時刻を入力するテキストボックスが複数あるなら、TextBox_Changeイベントのモジュールも複数になります

Private Sub TextBox9_Change()
 ActiveCell.Offset(1,0).Value = TextBox9.Value
End Sub

Private Sub TextBox10_Change()
 ActiveCell.Offset(2,0).Value = TextBox10.Value
End Sub

Private Sub TextBox11_Change()
 ActiveCell.Offset(3,0).Value = TextBox11.Value
End Sub

Private Sub TextBox12_Change()
 ActiveCell.Offset(4,0).Value = TextBox12.Value
End Sub
 
Private Sub UserForm_Activate()
 TextBox9.Value = Format(ActiveCell.Offset(1,0).Value, "h:mm")
 TextBox10.Value = Format(ActiveCell.Offset(2,0).Value, "h:mm")
 TextBox11.Value = Format(ActiveCell.Offset(3,0).Value, "h:mm")
 TextBox12.Value = Format(ActiveCell.Offset(4,0).Value, "h:mm")
End Sub

#01ではUserForm_Initializeイベント使いましたが、複数のシートに繰り返してユーザーフォームで入力を行うようなのでUserForm_Activateイベントに変更しました。

ただアクティブセルを基準にしてセルに値を書き込むのは、トラブルの元のように思えて仕方ないですが、その仕様で大丈夫ですか

#01です。補足ありがとうございました
まず先の回答を理解するために新規のブックにユーザフォームとテキストボックスを1つ配置して、ユーザーフォームのモジュールシート(VBE画面でユーザーフォームをダブルクリックすると開くシート)に#01のVBAを貼り付けて動作を確認してください。

その上で、時刻を入力するテキストボックスが複数あるなら、TextBox_Changeイベントのモジュールも複数になります

Private Sub TextBox9_Change()
 ActiveCell.Offset(1,0).Value = TextBox9.Value
End Sub
...続きを読む

QEXCEL VBAのコンボボックスで日だけを表示する方法

EXCELのVBAを使って経費の打ち込みをするマクロを作っています
その中で、コンボボックスで日付を選択するようにしました
コンボボックスに表示する日付はセルから「RowSource」で取り出しました
セルの日付の入力形式は「2008/10/1」です
そのセルの書式設定で表示形式を「ユーザー定義で d (日だけ表示)」としています
なので、コンボボックスで選択して表示する際も日だけを表示したいのですがうまくいきません
ComboBox1 = Format(ComboBox1, "d")
とすると、コンボボックス内で数字がちらちらしてランダムに数字が表示されてしまいます
ComboBox1 = Format(ComboBox1, "m月d日")
この形だと、きちんと「10月1日」の様に表示されます

Private Sub UserForm_Initialize()

With ComboBox1
.RowSource = "sheet1!A1:A5" '日付のセル

End With
End Sub

Private Sub ComboBox1_Change()
ComboBox1 = Format(ComboBox1, "m月d日")
End Sub

日だけを表示する方法をご教授ください

EXCELのVBAを使って経費の打ち込みをするマクロを作っています
その中で、コンボボックスで日付を選択するようにしました
コンボボックスに表示する日付はセルから「RowSource」で取り出しました
セルの日付の入力形式は「2008/10/1」です
そのセルの書式設定で表示形式を「ユーザー定義で d (日だけ表示)」としています
なので、コンボボックスで選択して表示する際も日だけを表示したいのですがうまくいきません
ComboBox1 = Format(ComboBox1, "d")
とすると、コンボボックス内で数字がちらちらしてラン...続きを読む

Aベストアンサー

こんにちは、#4です。
ご丁寧なレスをどうも。

えーと、、、
ComboBox から シリアル値を返す必要はないようですね。

〉別解2ですが、5行だとうまくいくのですが、知識不足で、一月分の31行にするときにどこを変更すればよいか分からず31行では試せませんでした…
〉この方法も面白いので試してみたいと思うのですが。
〉ちなみに、表示される日付は2008/9/1の形から9月1日等の表示に変えることができるのでしょうか?

"一月分の31行"ということは、
日付型の値で、「日にちのみ」が表示されたセルが、
月の初め(1日)から末日まで、連続(欠落なく)して
A5:A35(または、A5:A32、A5:A34)の範囲にある、
ということですよね?

◆別解2、改、
ComboBox1 のリストを2列にして、
選択するリストの表示は「m 月 d 日」、
選択後の.Value(.Text)は「日にちのみ」にする
(※シリアル値が必要な場合は、合成することになります)
(一応、締め日がズレても[26日から翌25日とか]対応する筈です)

Private Sub UserForm_Initialize()
Dim vA
Dim i As Integer
Dim dpm

' ' 当月の日数を求める
dpm = Worksheets("Sheet1").Range("A5").Value
dpm = Day(DateSerial(Year(dpm), Month(dpm) + 1, 1) - 1)

' ' A5から下へ当月の日数分の範囲の値をバリアント型の変数vAに格納(内部的にDate型)
 vA = Worksheets("Sheet1").Range("A5:A" & dpm + 4).Value

' ' vAを一括で String型の「m 月 d 日」に変換(ワークシート関数のTEXTを使用)
 vA = Application.Text(vA, "m"" 月 ""d"" 日""")

ReDim Preserve vA(1 To dpm, 1 To 2)
For i = 1 To dpm
 vA(i, 2) = Day(vA(i, 1))
' ' vA(i, 2) = i ' でいいのかも? 
Next i

ComboBox1.List = vA
ComboBox1.TextColumn = 2

End Sub

一応、お尋ねの答えとしては、上のようになります。
(A列に誤(未)入力がある場合をケアしていません。)

1ヶ月分の日付を文字列にしたもの(「日にちのみ」と「m 月 d 日」)をリストにするのなら、
セル範囲にある日付を追いかけなくてもいいような気もしますね(^^;)。

◆別解2、改、改、
わざわざ書くほどでもありませんけど、、、
(こちらは、1日から末日、専用)

Private Sub UserForm_Initialize()
Dim dpm
Dim m As Long
Dim vA
Dim i As Integer
dpm = Worksheets("Sheet1").Range("A5").Value
m = Month(dpm)
dpm = Day(DateSerial(Year(dpm), m + 1, 1) - 1)
ReDim vA(1 To dpm, 1 To 2)
For i = 1 To dpm
vA(i, 1) = m & " 月 " & i & " 日 "
vA(i, 2) = i
Next i
ComboBox1.List = vA
ComboBox1.TextColumn = 2
End Sub


それでは、また

参考URL:http://www.clayhouse.jp/array/array.htm

こんにちは、#4です。
ご丁寧なレスをどうも。

えーと、、、
ComboBox から シリアル値を返す必要はないようですね。

〉別解2ですが、5行だとうまくいくのですが、知識不足で、一月分の31行にするときにどこを変更すればよいか分からず31行では試せませんでした…
〉この方法も面白いので試してみたいと思うのですが。
〉ちなみに、表示される日付は2008/9/1の形から9月1日等の表示に変えることができるのでしょうか?

"一月分の31行"ということは、
日付型の値で、「日にちのみ」が表示さ...続きを読む

QVBA コンボボックスで選んだ値を取得するには

ユーザーフォーム上のコンボボックスから値を選択し、その値を変数として使いたいのですが、うまくいきません。

コンボボックスのコードで
Private Sub ComboBox1_Change()
moji1 = ComboBox1.Text
Range("A1").Value = moji1
のようにすれば、コンボボックスから値を選んだ時点でA1セルにその値をコピーできるのですが、同じユーザーフォーム上にあるコマンドボタンをクリックして実行する「マクロ1」にてこのmoji1という変数を使いたいのです。

マクロ1にて、上記と同じ
Range("A1").Value = moji1
というコードを記述しても、ユーザーフォームで選択した値が消えており、empty値となってしまいます。

原因をご存知の方はお教えください。

Aベストアンサー

原因については下記を参考にしてください。
http://pc.nikkeibp.co.jp/pc21/special/2007_gosa/eg5.shtml

QVBAでシートからコンボボックスにデータを設定する方法

VBAにてフォーム起動時にシート内に設定した
値をコンボボックスに取り込みたいのですが・・。
たとえばA列に連続で入力されているデータを
取り込むなど・・。
設定データ数は動的に変化します。

Aベストアンサー

もうほとんど同じですが…

Private Sub UserForm_Initialize()
Dim i As Integer

 ComboBox1.Clear
 For i = 1 To Worksheets("sheet1").Cells(Rows.Count, 1).End(xlUp).Row
  ComboBox1.AddItem Worksheets("sheet1").Cells(i, 1).Value
 Next
End Sub

QエクセルVBA ユーザーフォームのTextBoxを日付にしたい

いつもいつも 皆様からのお返事を心待ちにしておりますNannyです。

VBAのユーザーフォームでTextBoxを日付専用入力にしたいのです。

で、入力方法が 20050219 というような形で入力して、2005/02/19という形か、平成17年2月19日というような形に持って行って、セルに貼り付けしたいのです。

出来なさそうな予感満載なのですが、皆様お返事の程宜しくお願い致します。
(出来ないのであればあきらめられるので、出来るかどうかのお返事も期待しております。

宜しくお願い致します。

Aベストアンサー

下記はTextBox1に20050219としCommandButton1をクリックするとシート1のA1に2005/2/19と出力します。
Private Sub CommandButton1_Click()
Worksheets(1).Range("A1").Value = Format(TextBox1.Text, "0000""/""00""/""00")

End Sub

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

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

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

Qコンボボックスに日付を表示する

現在、VB.netを勉強中です。

コンボボックス内に今日から一週間分の日付を表示したいのですが、上手く行きません。

Dim dtToday As DateTime = DateTime.Today

ComboBox1.Items.Add(dtToday.ToString())

と書いたところ現在の日付を取得しコンボボックス内に
2013/5/28 00:00 と表示されています。

これを時刻を表示させず(2013/5/28 のみ表示)、For文を用いて一週間分表示させたのですが、どのようにすればよいでしょうか?

分かる方がいれば、よろしくお願いします。

Aベストアンサー

Dim dtToday As DateTime = DateTime.Today

For i As Integer = 0 To 6
ComboBox1.Items.Add(dtToday.AddDays(i).ToString("yyyy/M/d"))
Next

こんな感じかな?

QVBA コンボボックスの表示(日付)について

ComboBox1のIMEModeプロパティが0-fmIME MODE NOControlに設定されています。そして、下記コードを作成しました。
Private Sub ComboBox1_Change()
ComboBox1 = Format(ComboBox1, "m月d日")
End Sub
このコンボボックスに例えば、8/30と入力すると「8月3日0」と表示されてしまいます。
これを8月30日と表示するにはどうすれば良いのでしょうか?
よろしくお願いします。

Aベストアンサー

私の方が勉強が足りないのかもしれないが
色々書きましたが、結論は、DateValue関数を使えばよいのではないですか。
(1)VBAとあるから、エクセルVBAかアクセスVBAでしょうね
(2)コンボボックスは、設定したアイテムの中から選ぶのが基本だと思うが、本件ではテキスト部へ日付を入力するということですか。
(コンボでアイテムを選択するのは、日付は適さないととおもう。
年、月、日と3段構えになってしまう。質問はそのようには書いてない。)テキストボックスでよいのではと別途疑問は持つ。
(3)フォーマットでm月d日を適用できるのは、エクセルの場合は元が日付セリアル値でなければならないはず。
一方コンボやテキストボックスの返り値は、入力した場合は文字列ではないですか。
これにFormatを適用しても、ダメではないですか。
エクセルでは書式はNumberFormatといい、Numberデータを中心に
書式を設定することが明確に言われている。文字列データへの
書式設定はほとんど無い。
ただエクセルでは、入力した文字列数字データを強制的に数値化したりする力が強いので、わかりにくい例がある。
(4)Cells(2, 1) = DateValue(UserForm1.ComboBox1.Value)
としますと、8/13とコンボのテキスト部に入力したデータが、A1セルに2007/8/13の日付シリアル値で入りました。
これが解決策では無いですか。書式はセルに別途適応する。
Sub test02()
Cells(7, 1).NumberFormat = "m月d日"
End Sub
ーー
エクセルでは、日付を文字列にしてセルにセットするのは、限られた場面で、日付計算・多彩な書式設定に利用できず、有害の方が多い。
ーー
http://park5.wakwak.com/~weblab/refFormat.html
VB.NETでは、Format関数は、文字列を数値に変換しません。
とあるところを見ると、以前は数値化していた?。
すると8/30は30分の8に似られる?
ーー
エクセルVBAで
Cells(3, 1) = Format(8 / 30, "m月d日")
Cells(3, 1) = Format("8 / 30", "m月d日")
はいずれも書式設定(m月d日)した文字列にならない。
書式は別途セルに書式設定しないといけない。
文字列でVBAで入れると、エクセルの強力な日付転換機能が働き
書式なし、または設定済みの日付書式の日付になるよう。
(Cells(3, 1) = Format(8 / 30, "m月d日")は12月30日になるが私には説明できない。)

私の方が勉強が足りないのかもしれないが
色々書きましたが、結論は、DateValue関数を使えばよいのではないですか。
(1)VBAとあるから、エクセルVBAかアクセスVBAでしょうね
(2)コンボボックスは、設定したアイテムの中から選ぶのが基本だと思うが、本件ではテキスト部へ日付を入力するということですか。
(コンボでアイテムを選択するのは、日付は適さないととおもう。
年、月、日と3段構えになってしまう。質問はそのようには書いてない。)テキストボックスでよいのではと別途疑問は持つ。
(3...続きを読む

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

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

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

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

Aベストアンサー

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

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


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

人気Q&Aランキング