Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


10494 / 13646 ツリー ←次へ | 前へ→

【21490】条件を満たすセルの検索 みゆき 05/1/21(金) 22:09 質問[未読]
【21492】Re:条件を満たすセルの検索 かみちゃん 05/1/21(金) 22:21 回答[未読]
【21499】Re:条件を満たすセルの検索 みゆき 05/1/21(金) 23:25 質問[未読]
【21501】Re:条件を満たすセルの検索 かみちゃん 05/1/22(土) 0:07 回答[未読]
【21502】Re:条件を満たすセルの検索 りすりす 05/1/22(土) 0:08 発言[未読]
【21504】Re:条件を満たすセルの検索 みゆき 05/1/22(土) 0:21 お礼[未読]
【21505】Re:条件を満たすセルの検索 りすりす 05/1/22(土) 0:22 発言[未読]
【21506】Re:条件を満たすセルの検索 みゆき 05/1/22(土) 1:12 質問[未読]
【21510】Re:条件を満たすセルの検索 りすりす 05/1/22(土) 2:07 回答[未読]
【21519】Re:条件を満たすセルの検索 みゆき 05/1/22(土) 12:54 お礼[未読]
【21514】Re:条件を満たすセルの検索 かみちゃん 05/1/22(土) 10:46 回答[未読]
【21525】経過時間の計算 みゆき 05/1/22(土) 17:48 質問[未読]
【21529】Re:経過時間の計算 G-Luck 05/1/22(土) 19:24 発言[未読]
【21532】Re:経過時間の計算 りすりす 05/1/22(土) 21:13 回答[未読]
【21533】日数および時間計算に関するワークシート関... りすりす 05/1/22(土) 22:39 発言[未読]
【21537】Re:日数および時間計算に関するワークシー... みゆき 05/1/23(日) 0:16 お礼[未読]
【21493】Re:条件を満たすセルの検索 ponpon 05/1/21(金) 22:24 発言[未読]
【21497】Re:条件を満たすセルの検索 りすりす 05/1/21(金) 23:11 回答[未読]
【21500】Re:条件を満たすセルの検索 りすりす 05/1/21(金) 23:47 発言[未読]

【21490】条件を満たすセルの検索
質問  みゆき  - 05/1/21(金) 22:09 -

引用なし
パスワード
   はじめまして、VBAは初めてです。
業務で使用している顧客受付のエクセルファイルをVBAで操作したいと思い始めたところです。
別フォームに入力すべき事項をテキストボックスやコンボボックスなどでまとめその情報をエクセルへ流しこむプログラムです。
題名の通り、指定列の「セルが空白」の条件を満たすセルを検索してそこから入力を開始したいのですが、上手くいきません。
「B列」の4行目から検索を開始させたいのです。
ネットで検索してDo whileやfor文も使ってみましたが無限ループになってしまい抜けられなくなってしまいました。
使い方を理解していないのかも・・・。

ご教授お願い致します。

【21492】Re:条件を満たすセルの検索
回答  かみちゃん  - 05/1/21(金) 22:21 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>「B列」の4行目から検索を開始させたいのです。

もしかして、したいこととは違うかもしれませんが、
B4から下方向に最初の空白セルにセルを移動させるには、次の方法でできます。
Sub Macro1()
 With Range("B4").End(xlDown)
  If .Row <> Columns(1).Rows.Count Then
   .Offset(1).Select
  End If
 End With
End Sub

【21493】Re:条件を満たすセルの検索
発言  ponpon  - 05/1/21(金) 22:24 -

引用なし
パスワード
   ▼みゆき さん:

 私にはできませんが、……

>はじめまして、VBAは初めてです。
>業務で使用している顧客受付のエクセルファイルをVBAで操作したいと思い始めたところです。
>別フォームに入力すべき事項をテキストボックスやコンボボックスなどでまとめその情報をエクセルへ流しこむプログラムです。
  ↑
 どのような項目なのか?
 いくつあり?、どの項目をsheetのどのセルに流し込むのか?
 どの項目がテキストボックスやコンボボックス(Itemの数、項目)なのか
 などを書かないと答えようがないと思います。

>題名の通り、指定列の「セルが空白」の条件を満たすセルを検索してそこから入力を開始したいのですが、上手くいきません。
>「B列」の4行目から検索を開始させたいのです。

 上から詰めて次の行からというのであれば、A列にデータがあるとして、
 Range("A65536").End(xlup).Row+1で拾えると思います。
 過去ログもあります。

>ネットで検索してDo whileやfor文も使ってみましたが無限ループになってしまい抜けられなくなってしまいました。
>使い方を理解していないのかも・・・。
>
>ご教授お願い致します。

【21497】Re:条件を満たすセルの検索
回答  りすりす  - 05/1/21(金) 23:11 -

引用なし
パスワード
   >ネットで検索してDo whileやfor文も使ってみましたが無限ループになってしまい抜けられなくなってしまいました。
>使い方を理解していないのかも・・・。

このときの中断法は、ESCキーでVBが停止します。

【21499】Re:条件を満たすセルの検索
質問  みゆき  - 05/1/21(金) 23:25 -

引用なし
パスワード
   ▼かみちゃん さん:
>こんにちは。かみちゃん です。
>
>>「B列」の4行目から検索を開始させたいのです。
>
>もしかして、したいこととは違うかもしれませんが、
>B4から下方向に最初の空白セルにセルを移動させるには、次の方法でできます。
>Sub Macro1()
> With Range("B4").End(xlDown)
>  If .Row <> Columns(1).Rows.Count Then
>   .Offset(1).Select
>  End If
> End With
>End Sub

ありがとうございます。
<>で空白という意味を表しているんでしょうか?

実はこのセルの行数も知りたいんです。
空白セルが見つかったならば、その右隣へ
cells(同一行数,列数2)="名無しさん"
cells(同一行数,列数3)="受付時間" 
cells(同一行数,列数4)="受付番号" のように指定してデータを送っています。

上記のプログラムでは行数のカウントはされているんでしょうか?
初心者の為質問ばかりでごめんなさい。

【21500】Re:条件を満たすセルの検索
発言  りすりす  - 05/1/21(金) 23:47 -

引用なし
パスワード
   ▼みゆき さん:
>はじめまして、VBAは初めてです。
>業務で使用している顧客受付のエクセルファイルをVBAで操作したいと思い始めたところです。
>別フォームに入力すべき事項をテキストボックスやコンボボックスなどでまとめその情報をエクセルへ流しこむプログラムです。
>題名の通り、指定列の「セルが空白」の条件を満たすセルを検索してそこから入力を開始したいのですが、上手くいきません。
>「B列」の4行目から検索を開始させたいのです。
>ネットで検索してDo whileやfor文も使ってみましたが無限ループになってしまい抜けられなくなってしまいました。
>使い方を理解していないのかも・・・。
>
>ご教授お願い致します。


Aと1の交差した左上をぐいっと左クリックしたままにすると
その上に
65536Rx256C と表示されると思います。
それが、セルの最大数です。 Rは行、Cは列です。
つまり 65536行、256列しかあつかえないということです。
ですから、ループのカウントもそれを越えないようにしないといけません。

他の方がループを使わない簡単なやり方を説明されていますので
無限ループの解消の参考までに

Private Sub CommandButton1_Click()
 Dim ARow, ACol As Long
 Dim StartCell As String
 Dim i, j As Long
 
 ' 下に検索
 StartCell = "B4" ' 検索開始位置
 ARow = Range(StartCell).Row  ' B4の 行の数字を代入
 ACol = Range(StartCell).Column ' B4の 列の数字を代入
 
 For i = ARow To 65536 ' 行を操作
  If IsEmpty(Cells(i, ACol)) Then ' もし空白なら
   ' ここに処理
   ' i 行目、ACol 列目
   MsgBox (Cells(i, ACol).Address(0, 0) + " 空白発見")
   Exit For  ' for文をでる
  End If
 Next
 
 ' 右に検索
 For j = ACol To 256 ' 列を操作
  If IsEmpty(Cells(ARow, j)) Then
   ' ここに処理
   ' ARow 行目 、j 列目
   MsgBox (Cells(ARow, j).Address(0, 0) + " 空白発見")
   Exit For
  End If
 Next
End Sub

【21501】Re:条件を満たすセルの検索
回答  かみちゃん  - 05/1/22(土) 0:07 -

引用なし
パスワード
   こんにちは。かみちゃん です。

><>で空白という意味を表しているんでしょうか?

違います。
とりあえず、マクロを使わずに、B4にセルを移動して、Endキーを押して、↓キー
を押してみてください。
そうすると、B4から下方向に「連続して」データの入っている最下行のセルに飛び
ます。そしてさらに↓キーを一回だけ押すと、次の行は空白ですから、空白のセル
に移動します。
この操作が理解できれば、それをマクロの記録で記録してみてください。

ここでひとつ注意することがあります。この方法を用いたとき、Excelの最大行ま
ですべての行にデータが入っていた場合どうなるかです。
Endキーを押して、↓キーを押したあと、もう一回↓キーを押して移動することは
できません。それを回避しています。

つまり、
Range("B4").End(xlDown).Row
で、「連続してデータの入っている最下行」に移動して
Columns(1).Rows.Count
がExcelの最大行となりますので、それと異なる(<>で表します)のであれば、
移動した行から
Offset(1).Select
で一行下のセルに移動します。

>実はこのセルの行数も知りたいんです。

その空白の行は、
Selection.Row
で取得できますが、

>空白セルが見つかったならば、その右隣へ

Offset(0,1)で、空白セルの1列右
Offset(0,2)で、空白セルの2列右
Offset(0,-1)で、空白セルの1左
などとできます。

【21502】Re:条件を満たすセルの検索
発言  りすりす  - 05/1/22(土) 0:08 -

引用なし
パスワード
   ▼みゆき さん:
>▼かみちゃん さん:
>>こんにちは。かみちゃん です。
>>
>>>「B列」の4行目から検索を開始させたいのです。
>>
>>もしかして、したいこととは違うかもしれませんが、
>>B4から下方向に最初の空白セルにセルを移動させるには、次の方法でできます。
>>Sub Macro1()
>> With Range("B4").End(xlDown)
>>  If .Row <> Columns(1).Rows.Count Then
>>   .Offset(1).Select
>>  End If
>> End With
>>End Sub
>
>ありがとうございます。
><>で空白という意味を表しているんでしょうか?


<>は 条件文です  同じでない(≠)という意味です。
Not( = ) と同じです
リンゴ<>バナナ  なら Trueが戻ってきます
Not(リンゴ = バナナ)  なら Trueが戻ってきます
リンゴ=バナナ  なら Falseが戻ってきます
とかだったらわかります?


>
>実はこのセルの行数も知りたいんです。
>空白セルが見つかったならば、その右隣へ
>cells(同一行数,列数2)="名無しさん"
>cells(同一行数,列数3)="受付時間" 
>cells(同一行数,列数4)="受付番号" のように指定してデータを送っています。
>
>上記のプログラムでは行数のカウントはされているんでしょうか?
>初心者の為質問ばかりでごめんなさい。


Private Sub CommandButton1_Click()
 Dim ARow, ACol As Long
 Dim StartCell As String
 Dim i, j As Long
 
 ' 下に検索
 StartCell = "B4" ' 検索開始位置
 ARow = Range(StartCell).Row  ' B4の 行の数字を代入
 ACol = Range(StartCell).Column ' B4の 列の数字を代入
 
 For i = ARow To 65536 ' 行を操作
  If IsEmpty(Cells(i, ACol)) Then ' もし空白なら
   ' ここに処理
   ' i 行目、ACol 列目
    Cells(i, 2) = "名無しさん"
    Cells(i, 3) = "受付時間"
    Cells(i, 4) = "受付番号" 'のように指定してデータを送っています。
   Exit For  ' for文をでる
  End If
 Next
End Sub

【21504】Re:条件を満たすセルの検索
お礼  みゆき  - 05/1/22(土) 0:21 -

引用なし
パスワード
   ▼りすりす さん:
▼かみちゃん さん:

ありがとうございます。
上司も<>をよく使っていたんで気になっていたのですが分かりやすい説明でよく理解できました。

また、プログラムにコメントまでつけて頂き大変嬉しく思います。
私のやりたかった動作が出来ました。
今後これを見ながら、どういう動きをしているのかをじっくり理解していきたいと思います。

【21505】Re:条件を満たすセルの検索
発言  りすりす  - 05/1/22(土) 0:22 -

引用なし
パスワード
   >▼みゆき さん:

2列目だけで判断していますが、このままだと
名前書き忘れて 次に別のデータいれたら、 うわぁ〜 って泣きますよ。
業務用なら、2、3、4列とも 空白でないことを確認してから
書き込むという方が、間違って消した(>_<) というトラブルがないかと思います。


PPrivate Sub CommandButton1_Click()
 Dim ARow, ACol As Long
 Dim StartCell As String
 Dim i, j As Long
 
 ' 下に検索
 StartCell = "B4" ' 検索開始位置
 ARow = Range(StartCell).Row  ' B4の 行の数字を代入
 ACol = Range(StartCell).Column ' B4の 列の数字を代入
 
 For i = ARow To 65536 ' 行を操作
  If IsEmpty(Cells(i, ACol)) And _
    IsEmpty(Cells(i, ACol + 1)) And _
    IsEmpty(Cells(i, ACol + 2)) Then
   ' もし空白なら
   ' ここに処理
   ' i 行目、ACol 列目
    Cells(i, 2) = "名無しさん" ' Cells(i, ACol)
    Cells(i, 3) = "受付時間"   ' Cells(i, ACol + 1)
    Cells(i, 4) = "受付番号"   ' Cells(i, ACol + 2)
   Exit For  ' for文をでる
  End If
 Next
End Sub

【21506】Re:条件を満たすセルの検索
質問  みゆき  - 05/1/22(土) 1:12 -

引用なし
パスワード
   そうですね。ミスをなくす為にもそれも取り入れようと思います。

また質問が出たのですが、

 Cells(i, 2) = "名無しさん"

のところで名前を入力(送出)していますが、この名前の情報を元に「一般」と「会社関係」の2つに区分分けしたいのですが。
エクセルのセルには印刷欄外に「一般リスト」、「会社関係リスト」として名前のリストはあります。

人数が多いのでcase:○○○○だと書く行数がとんでもない数になってしまいます。
範囲指定でここからここまでを検索してマッチするものがあるかどうか検索してセルに区分を表示するなどと言った都合の良い記述法などはありますでしょうか?


表示例)

関 係   名 前  受付番号 受付時間 

会社関係 名無しさん   1    10:22
一般   ななしさん   2    10:25
 :     :     :    :
 :     :     :    :

初めはエクセル側で区別する式を入れておいたのですが、ユーザーフォームから情報を送るとどうも消えてしまうようで上手くいきませんでした。

【21510】Re:条件を満たすセルの検索
回答  りすりす  - 05/1/22(土) 2:07 -

引用なし
パスワード
   ▼みゆき さん:
>そうですね。ミスをなくす為にもそれも取り入れようと思います。
>
>また質問が出たのですが、
>
> Cells(i, 2) = "名無しさん"
>
>のところで名前を入力(送出)していますが、この名前の情報を元に「一般」と「会社関係」の2つに区分分けしたいのですが。
>エクセルのセルには印刷欄外に「一般リスト」、「会社関係リスト」として名前のリストはあります。
>
>人数が多いのでcase:○○○○だと書く行数がとんでもない数になってしまいます。
>範囲指定でここからここまでを検索してマッチするものがあるかどうか検索してセルに区分を表示するなどと言った都合の良い記述法などはありますでしょうか?
>
>
>表示例)
>
>関 係   名 前  受付番号 受付時間 
>
>会社関係 名無しさん   1    10:22
>一般   ななしさん   2    10:25
> :     :     :    :
> :     :     :    :
>
>初めはエクセル側で区別する式を入れておいたのですが、ユーザーフォームから情報を送るとどうも消えてしまうようで上手くいきませんでした。
区別する式もたぶんコピーできますよ。


とりあえず直接値をいれるやり方

Function Get関係(ByVal NameText As String) As String
 '整数でループしてもいいのですがちょっとかわったことしたくなったので
 ' http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=78;id=FAQ
 'こちらを参考にしました
  Dim cel As Range
 
  Dim 関係 As String

  関係 = ""
  For Each cel In Range("G2:G11") ' ここに検索範囲をいれる
   If StrComp(cel.Value, NameText) = 0 Then ' 名無しさん発見!!
    関係 = "会社関係"
    Exit For ' For文をでる
   End If ' If 終わり
  Next ' For 次の celへ
  
  If Len(関係) = 0 Then ' 文字が入っていないので 次の範囲を検索
  For Each cel In Range("H2:H11") ' ここに検索範囲をいれる
   If StrComp(cel.Value, NameText) = 0 Then ' ななしさん発見!!
    関係 = "一般"
    Exit For ' For文をでる
   End If ' If 終わり
  Next ' For 次の celへ
  End If
  
'  If Len(関係) = 0 Then 関係 = "誰だ???" ' リストにない文字
 
 Get関係 = 関係  ' 関数に値をいれて終了
End Function


Private Sub CommandButton1_Click()
 Dim ARow, ACol As Long
 Dim StartCell As String
 Dim i, j As Long

 ' 下に検索
 StartCell = "B4" ' 検索開始位置
 ARow = Range(StartCell).Row  ' B4の 行の数字を代入
 ACol = Range(StartCell).Column ' B4の 列の数字を代入

 For i = ARow To 65536 ' 行を操作
  If IsEmpty(Cells(i, ACol)) And _
    IsEmpty(Cells(i, ACol + 1)) And _
    IsEmpty(Cells(i, ACol + 2)) Then
   ' もし空白なら
   ' ここに処理
   ' i 行目、ACol 列目
    Cells(i, 2) = "名無しさん" ' Cells(i, ACol)
    Cells(i, 3) = "受付時間"   ' Cells(i, ACol + 1)
    Cells(i, 4) = "受付番号"   ' Cells(i, ACol + 2)
    Cells(i, 1) = Get関係("名無しさん")
   Exit For  ' for文をでる
  End If
 Next
End Sub

【21514】Re:条件を満たすセルの検索
回答  かみちゃん  - 05/1/22(土) 10:46 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>範囲指定でここからここまでを検索してマッチするものがあるかどうか検索して
>セルに区分を表示するなどと言った都合の良い記述法などはありますでしょうか?

まず一般操作の「編集」−「検索」を「マクロの記録」で記録すると、おおまかな
ことはわかります。
Findメソッドを使います。ヘルプにも使用例が載っています。
今回のり場合、例えば、以下のような感じでできると思います。
Sub Macro1()
 strName = "名無し"
 With Worksheets(1).Range("B1:B500")
  Set c = .Find(strName, LookIn:=xlValues)
  If Not c Is Nothing Then
   c.Select
   MsgBox c.Value & " さんの区分は " & _
    c.Offset(0, -1).Value & " です。"
  Else
   MsgBox "リストにありません"
  End If
 End With
End Sub

【21519】Re:条件を満たすセルの検索
お礼  みゆき  - 05/1/22(土) 12:54 -

引用なし
パスワード
   ▼りすりす さん:
ありがとうございます。出来ました。
今度は受付時間からの退出までの経過時間の計算にチャレンジしています。

【21525】経過時間の計算
質問  みゆき  - 05/1/22(土) 17:48 -

引用なし
パスワード
   受付時間から退出時間(現在時間)までを算出したいのですが、その計算式は出来ました。
さらにそこから、退出時間が3時間以内の人までは30分ごとに管理し、それ以降は1時間毎に管理したいのですが、表示を00:30→0.5h(02:30分なら→2.5h、05:00は5h)と表示させたいのです。
「24」をかけると書いてあった記事を見てまねてみましたが上手く表示してくれません・・・。

ようは駐車場の管理なのです。
30分まで無料、以降30分ごとに課金して、さらに3時間を超えるものは1時間毎に課金と言った具合です。(なので30分未満は00:16→0hと表示)

IF文で分岐させればよいのでしょうが、時間の変換が分からず苦労しています。
何度もすみません。

【21529】Re:経過時間の計算
発言  G-Luck  - 05/1/22(土) 19:24 -

引用なし
パスワード
   前の話と、別の問題であるなら、新規に投稿されてはどうですか?
ちなみに、日付や時間は、一日を1として、数値で入っています。
12:00:00と入力して、書式を標準にしてみてください。
時間のデータの感覚がわかると思います。

【21532】Re:経過時間の計算
回答  りすりす  - 05/1/22(土) 21:13 -

引用なし
パスワード
   ▼みゆき さん:
>受付時間から退出時間(現在時間)までを算出したいのですが、その計算式は出来ました。
>さらにそこから、退出時間が3時間以内の人までは30分ごとに管理し、それ以降は1時間毎に管理したいのですが、表示を00:30→0.5h(02:30分なら→2.5h、05:00は5h)と表示させたいのです。
>「24」をかけると書いてあった記事を見てまねてみましたが上手く表示してくれません・・・。
>
>ようは駐車場の管理なのです。
>30分まで無料、以降30分ごとに課金して、さらに3時間を超えるものは1時間毎に課金と言った具合です。(なので30分未満は00:16→0hと表示)
>
>IF文で分岐させればよいのでしょうが、時間の変換が分からず苦労しています。
>何度もすみません。


はーい りすりすのWindows講座のお時間です


小数部はその日の経過時間(24 時間制)です。

=(NOW()-TODAY())*24
は、0時からの経過時間
整数部分が 時間となります。
用途的にはそのまま使った方がいいので時間は切り取りません。

さらに、60をかけると 分になります。
=(NOW()-TODAY())*24*60
もうおわかりだと思います
退出時間- 受付時間
におきかえると
(退出時間- 受付時間 )*24*60
が経過した分です。
その数字にたいして、
条件文をつければいいわけです。


i=(退出時間- 受付時間)*24*60


ですから、
下記のように 分で条件文を分岐すればいいことがわかると思います。

おもしろそうだから
つくちゃった(^_^;)


Private Sub CommandButton1_Click()
 Dim i, h As Date
 Dim s As String

i = (Now - Int(Now)) * 24 * 60
' TODAY数値がおかしいのでデバッグするとTODAY がEmpty値になる  内部バグか
' Int(Now)で代用
' i = 181 ' ここの数字変えて試すといいです、

If (i < 30) Then
  s = "0h"
ElseIf (30 <= i) And (i < 3 * 60) Then
  h = Int(i / 30) * 30 ' 30で割り 0か30になるように調整
  If (h Mod 60) < 30 Then ' あまりがないので30分未満
    s = Format(h / 60, "0h")
   Else         ' あまりがあるので30分〜59分
    s = Format(h / 60, "0.0h")
  End If
ElseIf (i >= 3 * 60) Then
  h = Int(i / 60) ' 時間に直す
  s = Format(h, "#h")
End If

' Cells(1, 1) = s
End Sub

【21533】日数および時間計算に関するワークシート...
発言  りすりす  - 05/1/22(土) 22:39 -

引用なし
パスワード
   時間に関してのまとめのページが検索に引っかかってでてきたので
参考にどうぞ
↓ ↓ ↓
[XL2002] 日数および時間計算に関するワークシート関数について
http://support.microsoft.com/default.aspx?scid=kb;ja;416574

【21537】Re:日数および時間計算に関するワークシ...
お礼  みゆき  - 05/1/23(日) 0:16 -

引用なし
パスワード
   ▼りすりす さん:
>時間に関してのまとめのページが検索に引っかかってでてきたので
>参考にどうぞ
>↓ ↓ ↓
>[XL2002] 日数および時間計算に関するワークシート関数について
>http://support.microsoft.com/default.aspx?scid=kb;ja;416574


皆さんありがとうございます。
私の想いとうりのものが出来てきました。
月曜日に早速使えそうです^^
ご協力に感謝致します。

10494 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free