• ベストアンサー

Excel2007VBA時間の書式とLen関数

●質問の主旨 文字列の長さを返すLen関数の引数に 時間を設定すると戻り値が一定しないのはなぜでしょうか? また下記に示すように20や17などの数字がかえってくるの でしょうか? ●質問の補足 A1セルに入力されている時間が以下の通りだとします。 例1)1:11→20 例2)13:59→17 ●コード Sub test() Dim i as String i=Range("A1") Msgbox Len(i) End Sub 以上よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.3

#2です。 回答してから気が付きましたが、 「これを「5.82638888888889E-01」としないのは、『Excelの仕様なのでしょう。』」 ↓ 「・・・・『浮動小数点数のメモリへの格納の仕方からそうなるのでしょう。』」 に訂正してください。

dradra33
質問者

お礼

okormazd様 たびたびのご丁寧な説明ありがとうございます

その他の回答 (2)

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.2

「1:11」というのは、セルの表示形式であって、実際に格納されているのは、有効数字15桁のシリアル値です。 したがって、 「1:11」が1時11分とすれば、「0.0493055555555556」がシリアル値です。これは、頭からだと18桁になるが、Excelでは有効数字15桁として格納するので、「4.93055555555556E-02」になる。この文字数が20です。 「13:59」は、「0.582638888888889」で、文字数は17です。 これを「5.82638888888889E-01」としないのは、Excelの仕様なのでしょう。 もし、時刻表示の文字数がほしいなら、 i = Format(Range("A1").Value, "h:m") などとすればいい。

dradra33
質問者

お礼

okormazd様 ご回答ありがとうございます。 上記のアドバイス参考にさせていただきます。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.1

時間の入っているセルに対してLen関数を使うことのメリットがよくわかりませんが、単にLen関数を使った場合には時間で表示されているセルの表示形式を標準にしますと小数点以下の数値が表示されますね。その文字列の長さを求めることになります。セルの表示形式を関数で指定したうえでLen関数を使えばよ良いのですがLen関数を使うことの意義がよく理解できませんね。

dradra33
質問者

お礼

KURUMITO様 ご回答ありがとうございます。 私の質問の意図は時間形式「h:mm」の表示形式について 一定の規則性を見つけたかったからです。 ・「h:mm」の文字列の長さ ・「:」(半角セミコロン)の位置 等に規則性があるのではないかと考えていました。

関連するQ&A

  • VBA LENの使い方

    Lenを使う際にStrings.Lenとしないとエラーとなる場合があります。 Lenを使う際にクラスを明記すればいいんだと理解しましたが、別の問題が発生しました。 ユーザー定義のバイト数を求めるときにStringsをつけるとエラーになります。(いかにエラーになるコードを記載しました。) (LenはLenBとしてもエラーになります) そもそも、 クラスを明記しないとLenが探せない場合があってエラーになると思っていましたが、違うのでしょうか? オブジェクトブラウザでLenを検索してもVBAのStringしか出てきません。 Type a aa As Integer bb As Integer End Type Dim b As a Sub test() Dim a As Integer b.aa = 100 a = Strings.Len(b) End Sub

  • VBA関数の使い方がわからないです

    A1にはハイパーリンクとしてhttp://www.yahoo.co.jp/ が入っていて、標準モジュールで Sub Macro1() MsgBox HyperlinkAddress End Sub Function HyperlinkAddress(target As Range) As String HyperlinkAddress = target.Hyperlinks(1).Address End Function としたら、引数は省略できません。になるのですが、 どうすればいいですか? Sub Macro1() MsgBox Selection.Hyperlinks(1).Address End Sub これと同じような事を、関数を使って表現したいです。

  • Excel関数とVBAの組み合わせで。

    名前  |  総合計  |  ランキング あああ |  10    |   3 いいい |  12    |   2 ううう  |  8     |  4 えええ |   20    |  1 おおお |  4     |   5 というような感じでシートに入力されています。 (ランキングの部分はRANK関数を使用) これを元にグラフを作成するために、1位から3位までを変動的に抽出するようなコードを下記のようにしました。 -------------------------------------------------- Sub IP_Graph() Dim i As Integer Dim Ranking As String Dim Provider As String Dim AccessCount As String Dim Last As Integer '最終行取得 Last = Cells(2).CurrentRegion.Rows.Count For i = 3 To Last Ranking = Cells(i, 10) Provider = Cells(i, 2) AccessCount = Cells(i, 9) Select Case Ranking Case 1 Range("p_01") = Cells(i, 1) Range("access_01") = Cells(i, 2) Case 2 Range("p_02") = Cells(i, 1) Range("access_02") = Cells(i, 2) Case 3 Range("p_03") = Cells(i, 1) Range("access_03") = Cells(i, 2) End Select Next End Sub -------------------------------------------------- 上のように、1位から5位まで、ときちおんとランク分けされていればいいのですが、 実際は同じ数でランキングが同位だったりすることがおこります。 (例えば1位・2位・2位・4位・5位のように。) このような場合抜き出して作成した表の3位の部分が空欄になってしまいます。 上位3つを抜き出すためにはどうしたらいいのでしょうか? 表示上の並べ替えは行いたくないです。 Ex:2000

  • lenは文字数を取得する関数ですよね?

    vbaで Sub test() Dim i As Long Debug.Print Len(i) End Sub とすると、4が返るのですが、なぜなのかまったくわかりません。 iには0が入っているので、一文字だから1が返ると思うのですが・・・

  • EXCEL VBA におけるブック終了後の値の保存方法について

    EXCEL VBAについて質問があります。もしかしたら初歩的なことかもしれませんがよろしくお願いいたします。 まず、 Sub Test() Dim i As String i = InputBox("好きな果物を入力してください") Sheets("Sheet1").Range("A1").Value = i End Sub を実行し、ブックを保存して終了する。 ブックを開く Private Sub Workbook_Open() Dim k As String k = Sheets("Sheet1").Range("A1").Value If k = "みかん" Then MsgBox ("a") Else: MsgBox ("b") End If End Sub この処理を Sheets("Sheet1").Range("A1").Value = i というシート上のセルに値を保存するという方法を取らずに iの値をブック終了後もプロシージャ内に持っておくというのは可能なのでしょうか。 Publicで宣言してもブックを一度閉じると やっぱりiの値は保存されませんでした。 どうぞよろしくお願いいたします。

  • EXCEL2000とEXCEL2003のVBAについて

    現在、EXCEL2000で下記のコードを実行しています。 が、EXCEL2003で実行すると、 .UsedRange.Copy myb のコードが実行されているのにコピー出来ていません。 ファイルは開いていて、エラーは出ていないのです。 問題点わかる方教えていただけますか? Sub 日別データ読込() Dim rngsaki As Range Dim pathmacrobook As String Dim namebook As String Dim motobook As Workbook Dim myb As Variant Set rngsaki = Workbooks("残高集計用.xls").Worksheets(3).Range("a2") pathmacrobook = ThisWorkbook.Path & "\CSV読込データ12\" namebook = Dir(pathmacrobook & "*.xls") Do While Not namebook = "" Set motobook = Workbooks.Open(pathmacrobook & namebook) Set myb = Workbooks("残高集計用.xls").Worksheets(3).Range("A65536").End(xlUp) With motobook.Worksheets("Sheet1") .UsedRange.Copy myb End With motobook.Close False namebook = Dir() Loop MsgBox "完了しました" End Sub

  • Excel2007VBAプロシージャの引数について

    ●質問の主旨 下記コードのうち、 buf = buf & msg & vbCrLfについて 1.右辺の変数bufはどんな役割があるのでしょうか? 2.右辺のbufを省略したら、メッセージボックスに 表示される「Excel」の文字は3つから1つになります。 これはなぜでしょうか? ご存知の方ご教示よろしくお願いします。 ●コード Sub Sample8() Call Sample9("Excel", 3) End Sub Sub Sample9(msg As String, n As Long) Dim i As Long, buf As String For i = 1 To n buf = buf & msg & vbCrLf Next MsgBox buf End Sub

  • EXCEL2002 VBAのループ処理について

    セルB1~B24に入力した数字を i とすると、 コマンドボタンを押したときに、セルB1~B24にの全てに値が入力されていて、 セル( F & i )が空白であれば、そこにセルA1の値を入れるようなマクロを作成しています。 セル( F & i )への入力は、セルB1~B24の全部に数値が入力されており、セル( F & i )が空白があるときのみ処理が実行されるように。どちらかが満たされない場合には、メッセージボックスを表示し、処理しないようにしたいのですが、どうしても途中まで入力されてしまいます。 以下のようなコードですが、何か良い方法はないでしょうか? Private Sub CommandButton1_Click() 'ロール確認 Dim 入力 As String, パレット As String Dim i As Long, t As Long For i = 1 To 24 入力 = Range("B" & i) パレット = Range("F" & i) If 入力 = "" Then MsgBox "aaa" Exit For End If 'パレットNo.転記 If パレット <> "" Then MsgBox "bbb" Exit For ElseIf パレット = "" Then Range("F" & 入力).Value = Range("A1").Value End If Next i End Sub

  • EXCEL VBA WEEKDAY関数

    weekday関数について質問です。 Sub test() MsgBox Weekday(#2/19/2009#) End Sub 上記プログラムを参考に2009年2月i日の曜日を返すように 下記プログラムを作成したのですが、うまくいきません。 変数iの箇所に原因があると思うのですがどのようにしたら 解決できますでしょうか?? Sub test() dim i as string i=15 MsgBox Weekday(#2/i/2009#) End Sub 解決策、できましたら参考となるプログラムをお教えください。 よろしくお願いいたします。

  • 【Excel VBA】データの最大値抽出

    <まず初めに> QNo.9045833 QNo.9045805 QNo.9045800 QNo.9045456 以前の質問ですが、解決しております。 この場で失礼します。 <本第> Sub 課題() Dim i As Integer Dim max(1 To 4) As Integer Dim row As Integer Dim column(1 To 31) As Variant Dim Index As Integer Dim c As Integer For row = 20 To 23 For Index = 2 To 32 For i = 1 To 4 column(Index) = change_number(Index) MsgBox "変換後の文字列は" & column(Index) & "です。" If Range(column(Index) & row) > max Then max(i) = Range(column(Index) & row) End If Next Next Next End Sub Function change_number(Index As Variant) As Variant Dim al As String If IsNumeric(Index) = True Then al = Cells(1, Index).Address(RowAbsolute:=False, ColumnAbsolute:=False) ★ change_number = Left(al, Len(al) - 1) ★ Else change_number = Range(Val & "1").column ★ End If End Function 処理1~処理4に羅列されているデータの中から、 各最大値を抽出するマクロを作成したいと考えています。 インターネット上の例を参考しつつ、コードを書きました。 実行したところ、「型が一致しません」のエラーメッセージが表示されました。 どこが誤っているか、ご教示いただけないでしょうか。 また、例から引っ張ってきましたコードですが、                ※★印つけています。 何を行っているのかいまいち落とし込めていません。 こちらも併せてご教示いただけないでしょうか。 Excelデータの詳細↓ A20:処理1 A21:処理2 A22:処理3 A23:処理4 B20~AF23:任意の数字

専門家に質問してみよう