人に聞けない痔の悩み、これでスッキリ >>

VBAは初心者です。宜しくお願いします。
シート1のA1に840、B1に1730と単なる数字の値が入っております。
VBAを実行すると
シート2のA1に8:40、B2に17:30と時刻の値として取り扱えるように
表示させるには、どうすればよろしのでしょうか?

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

A 回答 (2件)

A1はA1


B1はB2にですか?
いったん文字列形式で00:00の形にしてからセットすればエクセルは時間と判断してくれます。

Sub test01()
Dim a As String, b As String
a = Format(Sheets("Sheet1").Range("A1").Value, "00:00")
b = Format(Sheets("Sheet1").Range("B1").Value, "00:00")
Sheets("Sheet2").Range("A1").Value = a
Sheets("Sheet2").Range("B2").Value = b
End Sub
    • good
    • 1
この回答へのお礼

merlionXXさん
シート1のB1をシート2のB1でした(汗
ですが、ご返答頂いた内容で十分ご理解できました!!
文字列形式できちんと認識してくれるんですね!
ご丁寧にありがとうございましたm(__)m

お礼日時:2009/02/15 20:02

VBAヘルプで


TimeSerial 関数
を調べてみてください。
    • good
    • 1
この回答へのお礼

marbinさん
TimeSerial関数というのをもう少し勉強させて頂きます。
ありがとうございました。

お礼日時:2009/02/15 20:17

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

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

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

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

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

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)
で切り上げです。

引数で、対象桁を変更できます。

QVBAによる時間変換及び時間計算

 勤務表を作成しているのですが、書式変換及び残業計算できません。

(前提)
Web勤怠システムの数値をコピー&貼り付けをしてエクセルへ転記しています。なので、書式が文字列になってしまいます。

A1==>19:40 ・・・書式は時刻
A2==>20:02 ・・・書式は文字列

Range("A3") = (TimeValue(Range("A2")) - Range("A1")) / 24
これでは、上手くできません。
他の方法(式)を、教えて下さい。

合わせて、6分未満は切り捨ての式を含めてくれると嬉しいです。

Aベストアンサー

どのようにうまく行けないかが分からないため正確な回答はできませんが、残業時間を6分単位の時刻形式で取得しようとしているが小数点付きの数字が表示される等して目的の結果を表示できないという風な推測の元、回答いたします。
まず、基本的な部分で
>Range("A3") = (TimeValue(Range("A2")) - Range("A1")) / 24
ですが、A3にも日付の書式を与えると正しい結果が表示されます。(分単位ですと書式に"[m]"と指定してみてください)

ただ、質問の内容に
>合わせて、6分未満は切り捨ての式を含めてくれると嬉しいです。
とあることと、VBAでの回答でいいことから、プログラムを大きく改変させていただきます。
---------------------------ここから---------------------------
Dim ZangyoMinutes As Integer '分単位の残業時間を格納する変数
Const MinimumTime As Integer = 6 '切り落とす分単位の設定
'差分の時刻を分単位で取り出す(A2>A1の場合に正になる)
ZangyoMinutes = DateDiff("n", CDate(Range("A1").Value), CDate(Range("A2").Value))
'求めた分単位の残業時間を6分単位で切り落とす
ZangyoMinutes = Int(ZangyoMinutes / MinimumTime) * MinimumTime
'代入する前にA3の書式を0:00形式に指定する
Range("A3").NumberFormat = "h:mm"
'A3に結果を代入する
Range("A3").Value = TimeSerial(0, ZangyoMinutes, 0)
---------------------------ここまで---------------------------
TimeValue関数の変わりにCDate関数を使用しています。基本的な動作は変わりませんが、TimeValue関数がVariant型を返すのに対してCDate関数はDate型を返すのが違いです。
まず、DateDiff関数が2個の時間の差を年・月・日・時・分・秒単位で求められる関数です。"n"が分に相当しますのでこの部分で残業時間を分単位で取得します。
続いて、一定間隔数字ごとに切り落とす式が
Int([元の数字]/[間隔])*[間隔]
になります。
あとは、表示したい方法でセルに表示をするわけですが、分のままでしたらそのまま
Range("A3").Value = ZangyoMinutes
でもいいですし、Excelの時刻の形式にしたいのであればTimeSerial関数を使用する感じですね。
TimeSerial([時],[分],[秒])
時・分・秒の3個は共に省略不可ですが、59を超えた数字を入れた場合は次の桁を繰り上げてくれるので何かと便利な関数です。
最後に、代入する前に書式を設定し、設定が終わったら値を代入すると完成です。(必ず書式設定を先に行ってください)

最後に
.Value .NumberFormatなどプロパティーはきちんと明示しましょう。

どのようにうまく行けないかが分からないため正確な回答はできませんが、残業時間を6分単位の時刻形式で取得しようとしているが小数点付きの数字が表示される等して目的の結果を表示できないという風な推測の元、回答いたします。
まず、基本的な部分で
>Range("A3") = (TimeValue(Range("A2")) - Range("A1")) / 24
ですが、A3にも日付の書式を与えると正しい結果が表示されます。(分単位ですと書式に"[m]"と指定してみてください)

ただ、質問の内容に
>合わせて、6分未満は切り捨ての式を含めてくれると...続きを読む

Qエクセルに入力された数値を ●時間●分 と変換

教えて下さい

エクセルに min(分)で数値が入力されています
それを 何時間何分 という表示に変える方法はありませんか?

例) 445 → 7時間25分

表示は 7:25 でも 7.25 でも、何でも構いません

よろしくお願いします

Aベストアンサー

A列に「445」のような分が入力されているとして

B1=TIME(0,A1,0)
とします。
表示形式で「○時○分」などに変更すれば、

7時間25分…と表示可能です。

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

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

Aベストアンサー

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

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

Qvba セルに入力した時間をマクロで受け取るには?

はじめまして、
マクロを使ってタイマーをセットしているのですが、
たとえば1行A列に9:00:00という時間をセットして、
それをマクロでうけとりmacro1というマクロを時間とおりに動かすようにタイマーにせっとします。
プログラムは以下のとおりなのですが、
TimeValue(Cells(1, 1))のところがうまくいきません。

解決方法を教えてください。
よろしくお願い思案す。


Set_timer = TimeValue(Cells(1, 1))
Cells(5, 3) = "設定完了"
MsgBox "タイマーを設定しました。"
Application.OnTime TimeValue(Set_timer), "macro1"

Aベストアンサー

こんにちは。

TimeValueの引数は文字列でなければいけません。

ところがセルに時刻を入力すると見た目は時刻ですが、実際の値は「シリアル値」と呼ばれれる値になります。

文字列のところにシリアル値を入れているので「型が一致しません」とエラーになるのです。

そこでこのシリアル値を表示と同じような文字列に変換してやります。

Set_timer = TimeValue(Cells(1, 1))
     ↓
Set_Timer = Format(Cells(1, 1).Value, "h:mm:ss")

とします。どうでしょうか。

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

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

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

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

Aベストアンサー

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

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

QDate型の範囲を超える数値について

経過時間を求めるときに、

dim Time as Date
dim Keika as Date
Keika = Now - Time
Keika = Format(Keika, "hh:mm:ss")

でよいと思うのですが、経過時間が24時間以上になる可能性のある
プログラムはどのように書けばいいのでしょうか?
例えば、53:49:12のように計算したいのですが。
Date型は23:59:59の範囲しかダメなんですよね・・・・。

Aベストアンサー

こんにちは。itohhといいます。

たしかに、Date型だと上手く計算できません。
でも、経過時間を計算してくれる関数(DateDiff)を併用するとうまくいきますよ。

例.
Dim wTime As Date
Dim Keika As Date
Dim wBuf As String
Dim wNow As Date

wTime = DateValue("2001/7/16")
wNow = Now
Keika = wNow - wTime
wBuf = DateDiff("h", wTime, wNow) & Format(Keika, ":nn:ss")

QExcel VBAの残業時間の合計計算について

お世話になります。

seaclearsky8です。

残業データ ”6:00” ”7:00” ”8:00” ”9:00”  各残業時間

dim ztime1,ztime2 as date

ztime1="0:00"

ztime2=上記の各残業時間を順位いれていく処理

ztime1=timevalue(ztime1) + timevalue(ztime2)  残業時間の合計計算処理

24時間を越えるまでなら正常に計算できるのですが
timevalueの性質上24時間を越えると0:00に戻り
残業時間の合計が26時間なら2:00と計算されます。
これを26時と計算方法はあるのでしょうか?

ztime=format(ztime,"hh:mm")と

TimeValue(WorksheetFunction.Text(ztime1, "[h]:mm")) +
TimeValue(WorksheetFunction.Text(ztime2, "[h]:mm"))

も試しましたが上記と同じ結果になりました。

timevalueではできないのでしょうか?

宜しくお願いします。

お世話になります。

seaclearsky8です。

残業データ ”6:00” ”7:00” ”8:00” ”9:00”  各残業時間

dim ztime1,ztime2 as date

ztime1="0:00"

ztime2=上記の各残業時間を順位いれていく処理

ztime1=timevalue(ztime1) + timevalue(ztime2)  残業時間の合計計算処理

24時間を越えるまでなら正常に計算できるのですが
timevalueの性質上24時間を越えると0:00に戻り
残業時間の合計が26時間なら2:00と計算されます。
これを26時と計算方法はあるのでしょうか?

ztime=format(ztime,"hh:mm")と

TimeVa...続きを読む

Aベストアンサー

こんばんは!

Excelのヘルプを見ると
>TIMEVALUE関数は時刻を表している文字列をシリアル値(少数)に変換します
すなわち引数は「文字列」となりますので、
実データ(ztime1やztime2)が数値の場合はエラーになると思います。

単純に
ztime1 + ztime2
のように、値(数値)の足し算にして、表示形式だけを
○○.NumberFormatLocal = "[h]:mm"
のようにしてみてはどうでしょうか?m(_ _)m

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....続きを読む

Q3桁または4桁の数値を時刻に変換したい

Excel2003でマクロ作成の初心者です。
3桁または4桁の数字を時刻に変更したいです。
  820→8:20  1020→10:20
ネットで捜したら、見つかりましたが、これを実行すると問題点があります。
ア).NumberFormatLocal = "h:mm;@"を使うとエラーがでるので
  実行時エラ-1004
  rangeクラスの NumberFormatLocalプロパティを設定できません。
イ) .Formula = Left(t, 2) & ":" & Right(t, 2)に変更しましたが
   1020はできましたが、820はできません。
   '0820 とするとできます。
  これを「'」をいれなくとも 8:20 のようにしたいです。
ウ)また数値を入力したセルを削除すると即座に
 実行時エラー13 型が一致しません。とでます。
  これを出ないようにしたいのです。
------------------------------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
Dim t As String
t = Target.Value
'時間に変換する場所を制限します。
'デフォルトでは「A1」と「C1からD2」に入力した場合のみ処理が実行されます
If Application.Intersect(Target, Range("A1,C1:D2")) Is Nothing Then Exit Sub
'入力された数値が4桁以外の場合ははじかれます。
If Len(t) <> 4 Then Exit Sub
With Target
'セルの書式を時間に設定します。
.NumberFormatLocal = "h:mm;@"
'四桁の数字に「:」を追加します。
'この部分はほかにもいろいろな方法があると思います。ので変えてください。
.Formula = Left(t, 2) & ":" & Right(t, 2)
End With
End Sub

Excel2003でマクロ作成の初心者です。
3桁または4桁の数字を時刻に変更したいです。
  820→8:20  1020→10:20
ネットで捜したら、見つかりましたが、これを実行すると問題点があります。
ア).NumberFormatLocal = "h:mm;@"を使うとエラーがでるので
  実行時エラ-1004
  rangeクラスの NumberFormatLocalプロパティを設定できません。
イ) .Formula = Left(t, 2) & ":" & Right(t, 2)に変更しましたが
   1020はできましたが、820はできません。
   '0820 とするとできます。
  これを「'...続きを読む

Aベストアンサー

表示だけの事なら
書式設定で#0":"00でいいと思います。

あえてマクロにするなら
Private Sub Worksheet_Change(ByVal Target As Range)
If Application.Intersect(Target, Range("A1,C1:D2")) Is Nothing Then Exit Sub
Target.NumberFormatLocal = "#0"":""00"
End Sub

質問者さんのマクロに追加するならば
Private Sub Worksheet_Change(ByVal Target As Range)
Dim t As String
On Error Resume Next (1)
t = Target.Value
If Application.Intersect(Target, Range("A1,C1:D2")) Is Nothing Then Exit Sub
If Len(t) = 3 Then t = "0" & t (2)
If Len(t) = 2 Then t = "00" & t (3)
If Len(t) = 1 Then t = "000" & t (4)
If Len(t) <> 4 Then Exit Sub
With Target
.NumberFormatLocal = "h:mm;@"
.Formula = Left(t, 2) & ":" & Right(t, 2)
End With
End Sub
(1)~(4)を追加します。

表示だけの事なら
書式設定で#0":"00でいいと思います。

あえてマクロにするなら
Private Sub Worksheet_Change(ByVal Target As Range)
If Application.Intersect(Target, Range("A1,C1:D2")) Is Nothing Then Exit Sub
Target.NumberFormatLocal = "#0"":""00"
End Sub

質問者さんのマクロに追加するならば
Private Sub Worksheet_Change(ByVal Target As Range)
Dim t As String
On Error Resume Next (1)
t = Target.Value
If Application.Intersect(Target, Range("A1,C1:D2")) Is Nothing Then Exit ...続きを読む


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

人気Q&Aランキング