• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excel VBA の作り方について【初心者】)

Excel VBA の作り方について【初心者】

imogasiの回答

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

すでに回答が出ているが、少し違った考え方のコードで書いてみます。 データに統一ルールはずれの表現がある場合は、ややこしく(エラー等)なりますので注意。 例データ A-D列、C,D列が答え 営業部【山本】 1:35:24 山本 95 人事部【長谷川】 3:15:02 長谷川 195 業務推進部【今】 5:36:24 今 336 コード 前半はVBAのSPLIT関数を使っている。 後半の時刻の方は秒を「なし」にしてしまって考える手もあるが、そのまま分に直しても良いのかなとも思った。予期している答えと違う場合は式を修正してください。 前半はプロセスを見せるために、Msgboxで、しつこく変数の中身を出しているが、納得で来たら、すべてMsgboxの行は削除のこと。 Sub test01() Dim b() As String Dim c() As String For i = 1 To 3 a = Range("A" & i) MsgBox a b = Split(a, "【") MsgBox b(0) MsgBox b(1) c = Split(b(1), "】") MsgBox c(0) MsgBox c(1) Range("C" & i) = c(0) Next i '-- For i = 1 To 3 t = Range("B" & i) * 24 * 60 MsgBox Int(t) Range("D" & i) = Int(t) Next i End Sub 24*60(分の場合)や24*60*60(秒の場合)をかけるのは判りますか? 日付時刻しりあるちというものの仕組みからこういうものを使う。 Googleで「日付時刻シリアル値」で照会のこと。 http://www.excel.studio-kazu.jp/tips/0049/ 以下のGooglenで出てくるサイトの記事を読むこと。 エクセルVBAはエクセルの(特に日付、時刻の)仕組みを知らないとVBAが組めない1例の箇所です。

noname#245127
質問者

お礼

ご返信ありがとうございました。 こんな解釈もあるんだと、ついつい頷きながら見てしまいました。 メッセージボックスが組み込まれていたので、一つ一つポイントを押さえて理解することができました。 シリアル値というのは初めて聞いたのですが、勉強してみようと思います。 本当にありがとうございました。

関連するQ&A

  • エクセルVBA初心者です。

    エクセルVBA初心者です。 a1   3   5 a2   2   7 a3   1   7 a4   3   1 上で例えると、求めたい値は3*5+2*7+1*7+3*1=39です。  a1という文字を検索し、そして(a1の隣のセル)*(a1の隣の隣のセル)  次に (a2の隣のセル)*(a2の隣の隣のセル) と言う風にくりかえし、  最後に今まで乗算してでた値を合計してセルに結果を入力させるマクロなのですが、  エラーが何度も出て修正してはいるのですが、もうお手上げ状態です。   #以下がそのマクロです。 Sub マクロ() Dim fCell As Range, fAdr As String Dim a() As Double Dim i As Integer, j As Integer i = 0 j = 0 Set fCel = Cells.Find(What:="a1", LookAt:=xlWhole) If Not fCell Is Nothing Then Do While fCell.Offset(j, 0).Address <> fCell.End(Direction:=Down).Address j = j + 1 Loop ReDim a(j) As Double fAdr = fCell.Address For i = 0 To (j - 1) a(i) = fCell.Offset(0, 2).Value = fCell.Offset(0, 1).Value * fCell.Offset(0, 2).Value a(5) = a(5) + a(i) Next i fCell.Offset(j + 1, 1).Value = a(5) Else End If End Sub 本当に初心的なことだと思いますが、どうかよろしくお願いします。

  • エクセルVBAについて質問です。(超初心者です。)

    この度初めて投稿させて頂きます。 当方、VBAを始めてまだ1ヶ月も経たない初心者ですが、何卒宜しくお願い致します。 まずやろうとしていることですが、 表(5列)の1行から言葉を検索し、その言葉がある1列のみにロック(入力等の操作不可)をかけ、その後複数カラムのロックを解除、入力を可能なものにするというものです。(説明が下手で申し訳ないです。) 恥ずかしながらコードの方を記載します。 Sub test() Dim KEKKA As Range Dim I As Long Dim J As Long With Worksheets("シート名") For I = 2 To 6 Set KEKKA = .Range("B1" & I).Find(what:="ABC") If KEKKA Is Nothing Then ElseIf Not KEKKA Is Nothing Then ' シート保護を解除 ActiveSheet.Unprotect For J = 1 To 27 '該当するセルの一列をロック .Range("B1" & I).Offset(0, J).MergeArea.Locked = True【ここでエラーになります。「RangeクラスのLockedプロパティを設定できません。」】 'ロックを有効にする。 ActiveSheet.Protect Next J .Range("X1" & I).Locked = False .Range("Z1" & I).Locked = False .Range("AB1" & I).Locked = False End If Next I End With End Sub デバックしてみたのですが、I・Jには値が代入されていました。 また、offset部分を外したりすると(求める動作ではなくなりますが、原因を突き止めるために試したりしています。)「型が一致しません。」というエラーになります。 おそらく相当初歩的なことだとは思われますが、何卒ご助力願えますよう、お願いいたします。 OS:XP エクセルバージョン:2000

  • EXCEL VBAについて教えてください

    はじめまして。 過去ログに私のやりたいような内容を探していたらこのような下記のエクセルVBAがあったので、教えて頂きたいです。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub If Target.Value = "" Then Exit Sub x = Target.Value With Application .ScreenUpdating = False .EnableEvents = False .Undo y = Target.Value Target.Value = x + y .EnableEvents = True .ScreenUpdating = True End With With Cells(ActiveSheet.Rows.Count, "C").End(xlUp) .Offset(1, 0).Value = x .Offset(1, 1).Value = Time() End With End Sub A1に入力するたびに同一セルに加算。 A1をクリアできる。 C列に入力履歴、D列に入力時間を記録。 If Target.Address <> "$A$1" Then Exit Sub の$A$1を変えることによって他のセルにも設定できる。 と、いう内容なのですが、これをたとえば同一シートのA1~E10のセルとA12~E22にも同じよう別々に処理できるように設定したいのですが、どのようにすればいいのでしょうか?ちなみにA11~E11とA23~E23は合計を表示するセルにしたいです。 Excelのバージョンは2003です。 よろしくお願い致します

  • VBAについて

    いつもお世話になっています マクロ・VBA超初心者です。 質問させてください。 現在シート1の完売のセルの欄に○が入っていれば日付をみてシート2の同じ日付の隣のセルに○を入力しようと思っているのですが、シート2の日付を検索はしているんですが入力がいきません Sheet1  ↓セルA1 ↓セルB1  5月26日   26           B1のセルはDAY(A1)にて出してます         完売  A氏     ○             Sheet2  ↓A列   ↓B列 5月  1日  ・  ・  ・  26日    ○           ←シート1の所に○が付いているとシート1セルB1と同じ  27日                  日付の隣のセルに○を入力  28日 VBA Sub test() Sheets("Sheet2").Select Range("A1").Select Do Until ActiveCell = "" ActiveCell.Offset(1, 0).Activate If ActiveCell.Value = Worksheets("Sheet1").Range("B2") Then ActiveCell.Offset(0, 1).Activate If ActiveCell.Value <> "○" Then ActiveCell.Valu = "○" ActiveCell.Offset(0, -1).Activate Else ActiveCell.Offset(0, -1).Activate End If Else End If Loop Sheets("Sheet2").Select Range("A1").Select End Sub どこが間違っているかわからない状態です。 分かりにくい説明ではあるんですが教えてください お願いします。

  • エクセル VBA マクロについて

    VBA初心者です。 Sub 記入() Range("H8", "J14").Copy Range("C" & Rows.Count).End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats Application.CutCopyMode = False Range("H15", "J21").Copy Range("C" & Rows.Count).End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats Application.CutCopyMode = False Range("H22", "J28").Copy Range("C" & Rows.Count).End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats Application.CutCopyMode = False Range("K13").Select End Sub こういうマクロを作り上手く作動しましたのでB列に日付を記入したいと思い Sub 日付() Range("("B" & Rows.Count).End(xlUp).Offset(1)","("C" & Rows.Count).End(xlUp).Offset(0, -1)").Value = Date End Sub このようなマクロを組みましたがエラーがでます。どなたか直して頂けませんか?よろしくお願いします。

  • Excel VBA の作り方について【初心者】

    Excel VBA の作り方について質問させてください。 A1セルに「営業部【山本】」と入力されています。 B1セルに「01:35:24」(タイム)と入力されています。 (1)C1セルに「山本」を抜き出して表示 (2)D1セルに「95」(分数)で表示 (3)A2以降で同じ作業の繰り返し(最終入力列まで) というVBAを作成したいです。 マクロの場合だと、 (1)の部分は、=MID(LEFT(A1,FIND("】",A1)-1),FIND("【",A1)+1,50) (2)の部分は、=TEXT(A1,"[m]")*1 で入力ができますが、VBAの場合は違うため、困っております。 分かる方がおられましたら、よろしくお願いします。

  • エクセルVBAについて質問です。初心者です。

    エクセルVBAについて質問です。初心者です。 ユーザーフォームにリストボックスとコマンドボタンを1つずつ配置しています。  A列 B列 りんご 1 みかん 2 (りんご、みかん、1、2を太い罫線で四角に囲んでいます)    リストボックスには「りんご」と「みかん」が入っていて、りんごを選びコマンドボタンを押すと、「りんご」と「1」のセルが消去され、上方向にセルをずらすようにしています。 「みかん」を選びコマンドボタンを押すと「みかん」と「2」のセルが消えるのですが、そのとき「みかん」と「2」のセルの下段に引いている罫線まで消えてしまうのです。これを阻止する方法を教えていただけないでしょうか。 以下はコードです。 Private Sub CommandButton1_Click() Range("A1").Offset(ListBox1.ListIndex).Delete Shift:=xlUp Range("A1").Offset(ListBox1.ListIndex, 1).Delete Shift:=xlUp Unload UserForm1 End Sub おそらくこれに 「もし消去対象のセルが最終行のセルであれば With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With これを行いなさい」という感じのコードを作ればいいと思うのですが、『もし消去対象のセルが最終行のセルであれば』の部分がうまく作れません…。 なおA列、B列の文字・値はどんどん増えていく可能性があるので最終行を使っています。 よろしくお願いします。

  • エクセルVBAの書き方で教えてください。

    エクセルで、 「A列にデータを入力した日付をB列に自動で入れる」 (A列のデータを消したときは、B列のデータも消える)ということをするのに、 他の質問を参考にして、 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then   '対象の列が1列目(A列)なら If Target.Value <> "" Then   '入力された値がブランクでなければ Target.Offset(0, 1).Value = Date   '0行ずれた(同じ行)の1列右隣に日付を入れる Else       'そうでなければ(Deleteキーで消されたら) Target.Offset(0, 1).Value = ""   '同行右隣をブランクすなわち""として消す End If      '入力された値の処理終り End If      '1列目(A列)の処理終り、従ってB列以降はチェックしない End Sub と、入力して、うまく動きました。 ところが、「A列に入力」→「B列に自動で日付」だけでなく、 「D列に入力」→「E列に自動で日付」 「H列に入力」→「I列に自動で日付」と、1つのエクセルシートの中で いくつかの同じ条件のことを繰り返そうと思うとうまくいきません。 この場合、どのようにVBAを記入したら良いのか、教えてください。 よろしくお願いします。

  • excel vbaについてです

    VBA初心者で、暇な時にいろいろためしています。 以下のマクロを組んだのですが、エラーがでてうまくいきません。 どこがいけないのかご指摘願います。 Sub ather() Dim A As Range Dim B As Range Dim i As Integer With ThisWorkbook.Worksheets("Sheet1") For i = 1 To 30 Set A = Cells(i, 1) Set B = Cells(1, i) If Not .Range(A).Interior.ColorIndex = vbYellow Then GoTo port10 If Not .Range(B).Interior.ColorIndex = vbRed Then GoTo port10 .Range(B).Offset(, 1).Value = "○" port10: Next i End With End Sub イメージとしてはセルの塗りつぶしが黄色で、かつ右隣のセルの塗りつぶしが赤の時に、 赤色セルの右隣のセルに○を表示させようとしているのですが。。。 こうしたらいいんじゃない?といったアドバイスもお願いします(-人-)

  • Excel VBAの非表示について(初心者)

    Excel VBAを勉強中の者です。 A列に日付が連続で入っている表で、A1に入力されている一番古い日付から 昨日の日付までを非表示にし、今日の日付を先頭に表示したいと思っています。 Findメソッドで昨日の日付が入っているセルを検索し、A1セルから昨日のセルまでを 非表示にしようと思い下記のようにしてみたのですができませんでした。 Dim i As Range Dim x As Byte Dim y As Byte Set i = Range("A1:A65536").Find(What:=Date-1) x = i.Row Rows("1:x").Hidden = True または x = i.Address Range("A1:x").EntireRow.Select Selection.Hidden = True 教えてください。 よろしくお願いします。