Excel VBA質問箱 IV

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

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


74 / 3841 ページ ←次へ | 前へ→

【81009】Re:オートフィル後の可視セル抽出に関して
発言  Jaka  - 19/7/8(月) 17:42 -

引用なし
パスワード
   オートフィル??

>列数の場合はうまくいきませんでした。

よく解ってないけど。

fot Each セル1 in 可視セル範囲.columns(3).Areas
  for Each セル2 in セル1
・ツリー全体表示

【81008】Re:精算日を自動算出する関数式
発言  Jaka  - 19/7/8(月) 17:10 -

引用なし
パスワード
   =IF(WEEKDAY(A1)<5,6-WEEKDAY(A1)+A1,7-WEEKDAY(A1)+6+A1)
・ツリー全体表示

【81007】オートフィル後の可視セル抽出に関して
質問  まみ  - 19/7/8(月) 16:15 -

引用なし
パスワード
   はじめまして。
ExcelVBAではオートフィル操作に弱いというのは知っていますが、
業務上どうしてもやらなければなりません。

そこで質問があります。

以下、オートフィルして絞りこんだ行の中の1つの値を
上から順番に取得するというロジックを書きたいのですが、
うまくいきません。

つまり、

   A    B    C    D  
1 りんご  AAA   まさよ  海
2 みかん  BBBB  かおる  海
3 バナナ  DIDI  りえ   山
4 キウイ  FRFR  なおこ  山
5 いちご  NNN   あかり 海



オートフィルでD列から「海」だけ取り出す
   A    B    C    D  
1 りんご  AAA   まさよ  海
2 みかん  BBBB  かおる  海
5 いちご  NNN   あかり 海



C列の女性の名前を上から1件ずつメッセージ表示

ループ1回目→メッセージボックス「まさよ」
ループ2回目→メッセージボックス「かおる」
ループ3回目→メッセージボックス「あかり」


これに関して、色々なロジックをネットで調べましたが
うまくできません。

なお、「意外と使えるExcelでオートフィルタで表示しているセルだけ取得するVBA」というページも拝見しましたが、これだと行数はちゃんと取得できるものの、
列数の場合はうまくいきませんでした。

どう書けばよいのでしょうか。

ご教示よろしくお願いいたします。
・ツリー全体表示

【81006】PCの移行に伴うVBAの不具合について
質問  beans E-MAIL  - 19/7/8(月) 14:12 -

引用なし
パスワード
   OS Windows7 excel2013のPCからWindows10 excel2019のPC へ移行したところ、
これまで問題なく動いていた下記のマクロが、
(Rectangleクラスのcopyメソッドが失敗しました)として、完了できなくなってしまいました。
狙った行の抽出をするところまでは、動いているようなのですが、抽出された行にオートシェイプで作成した図形を張り付ける、赤色の下線を引くといった動作ができておりません。
エラーの際にデバッグを選択すると、下記Sub連続用4() 内のselection copyというところが黄色くマークアップされていました。

どのようにすればエラーを回避し、動作を完了できますでしょうか?
お助けいただけましたら幸いです。


Sub 連続用5()
  Sheets("連続用").Select
  Range("Y5:AC3000").Select
  Selection.ClearContents
  Range("A1").Select
End Sub
Sub 連続用2()
  Sheets("連続用").Select
  Application.ScreenUpdating = False
  
  Dim meibo As Worksheet
  
  Set meibo = Worksheets("連続用")
    
  ro = 5
  While meibo.Cells(ro, 1) <> ""

  Range("Y4:AC4").Select
  Selection.Copy
  Cells(ro, 25).Select
  ActiveSheet.Paste
    ro = ro + 1
  Wend
  Application.ScreenUpdating = True

End Sub

Sub 連続用3()
  Sheets("連続用").Select
  Application.ScreenUpdating = False

  Rows("5:3000").Select
  Application.CutCopyMode = False
  Selection.Sort Key1:=Range("AC5"), Order1:=xlAscending, Key2:=Range("D5") _
    , Order2:=xlAscending, Key3:=Range("E5"), Order3:=xlAscending, Header:= _
    xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    SortMethod:=xlPinYin, DataOption1:=xlSortNormal, DataOption2:= _
    xlSortNormal, DataOption3:=xlSortNormal
  Range("A1").Select

End Sub

Sub 連続用4()

  Sheets("連続用").Select
  Application.ScreenUpdating = False
  
  Dim meibo As Worksheet
  
  Set meibo = Worksheets("連続用")
    
  ro = 5
  p = 6
  While meibo.Cells(ro, 1) <> ""

    If (Cells(ro, 29) = Cells(p, 29)) = True Then
      If (Cells(ro, 4) = Cells(p, 4)) = True Then
        If ((Cells(ro, 6) + Cells(2, 29)) > Cells(p, 5)) = True Then
          Range(Cells(ro, 5), Cells(p, 6)).Interior.ColorIndex = 35
          
          If (Cells(ro, 21) = Cells(p, 21)) = True Then
            If (Cells(ro, 5) <> Cells(p, 5)) = True Then
              If (Cells(ro, 6) <> Cells(p, 6)) = True Then
              
                ActiveSheet.Shapes("AutoShape 18").Select
                Selection.Copy
                Cells(ro, 1).Select
                ActiveSheet.Paste
                Selection.ShapeRange.IncrementTop 5.25
                Selection.ShapeRange.IncrementLeft 2.25
                
              End If
            End If
          End If
          
          If ((Cells(ro, 35) + Cells(p, 35)) - (Cells(ro, 34) + Cells(p, 34))) <= ((Cells(ro, 16) + Cells(p, 16)) - Cells(2, 30)) = True Then
            ActiveSheet.Shapes("AutoShape 18").Select
            Selection.Copy
            Cells(ro, 16).Select
            ActiveSheet.Paste
            Selection.ShapeRange.IncrementTop 5.25
            Selection.ShapeRange.IncrementLeft 2.25
          End If
          
  Cells(ro, 33).Select
  ActiveCell.FormulaR1C1 = "1"
  Cells(p, 33).Select
  ActiveCell.FormulaR1C1 = "1"
  
  Range(Cells(ro, 1), Cells(p, 23)).Select
  Selection.Borders(xlDiagonalDown).LineStyle = xlNone
  Selection.Borders(xlDiagonalUp).LineStyle = xlNone
  With Selection.Borders(xlEdgeLeft)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = xlAutomatic
  End With
  With Selection.Borders(xlEdgeTop)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = 3
  End With
  With Selection.Borders(xlEdgeBottom)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = 3
  End With
  With Selection.Borders(xlEdgeRight)
    .LineStyle = xlContinuous
    .Weight = xlMedium
    .ColorIndex = xlAutomatic
  End With
  
        End If
      End If
    End If
  
    ro = ro + 1
    p = ro + 1
  Wend
  Application.ScreenUpdating = True

End Sub
・ツリー全体表示

【81005】精算日を自動算出する関数式
質問  担当C  - 19/7/8(月) 11:35 -

引用なし
パスワード
   エクセルの関数を教えてください。

例えば、7/4-7/10に精算した経費は7/12に支払います。
7/11-7/17に精算した経費は7/19に支払います。


このように、ある週の木曜から水曜を基準として
水曜日の2日後である金曜の日付(精算日)を
自動で算出できる関数を教えていただきたいです。

自分で調べてみたのですが、わかりませんでした。。

宜しくお願い致します。
・ツリー全体表示

【81004】Re:サーバー内にあるフォルダとファイル...
発言  Romi  - 19/7/7(日) 16:37 -

引用なし
パスワード
   γさん

ありがとうございます。
ちょっと試してみます。

進捗は後ほど書きます。
・ツリー全体表示

【81003】Re:サーバー内にあるフォルダとファイル...
回答  γ  - 19/7/6(土) 21:49 -

引用なし
パスワード
   こちらの記事を参考にして研究して下さい。
ht tp://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_080.html
 ↑わざとスペースを入れています。とってジャンプしてください。
・ツリー全体表示

【81002】サーバー内にあるフォルダとファイル名を...
質問  Romi  - 19/7/6(土) 21:02 -

引用なし
パスワード
   サーバー上にある、フォルダ内のファイル名を一括で出したいです。

Sub Call_GetFileList()

  GetFileList03 "C:\Program Files"
  
End Sub

Sub GetFileList03(Search_Path)
Dim objFs As Object, objFiles As Object, objFolders As Object
Dim File_Path As String, File_Name As String
Dim i As Long, arrData
'処理が遅くなるのでプログラム実行中の画面描画を停止する
Application.ScreenUpdating = False
Set objFs = CreateObject("Scripting.FileSystemObject")
  'パスの取得
  For Each objFolders In objFs.GetFolder(Search_Path).SubFolders
    'サブフォルダまで検索するために再帰実行
    GetFileList03 objFolders.Path
  Next
  
  'ファイル名の取得
  For Each objFiles In objFs.GetFolder(Search_Path).Files
    '\マークを区切り文字として各文字列を配列に代入
    arrData = Split(objFiles.Path, "\")
    
    'セルに配列の各値を書き込む
    For i = 0 To UBound(arrData)
      ActiveCell.Offset(0, i).Value = arrData(i)
    Next i
    
    ActiveCell.Offset(1, 0).Select   
  Next
  
End Sub


ところが、これだとただ文字を羅列するだけで、少々見づらいです。
なので、フォルダごとに上手く結合とか罫線をつけて見やすいレイアウトに出来ないものでしょうか?すいません、上手く表現が出来なくて。。
・ツリー全体表示

【81001】Re:VBAによる電圧自動測定
お礼  ムズロウ  - 19/7/6(土) 12:57 -

引用なし
パスワード
   返信ありがとうございます
確認してみます
・ツリー全体表示

【81000】Re:VBAによる電圧自動測定
発言  よろずや  - 19/7/5(金) 21:18 -

引用なし
パスワード
   500回と指定したら必ず500個のデータが返ることは、保証されているのでしょうか?

Worksheets(new_Worksheets.Name).Cells(j + 4, i - 19) = DATA(j)

エラーで止まった時の j の値を確認しましょう。
・ツリー全体表示

【80999】Re:エクセル2016ですがクラッシュします
お礼  goushi  - 19/7/5(金) 18:56 -

引用なし
パスワード
   早速のご回答ありがとうございます
再度調整してみます
・ツリー全体表示

【80998】Re:エクセル2016ですがクラッシュします
回答  γ  - 19/7/5(金) 18:15 -

引用なし
パスワード
   小計 の処理のなかでセル内容を変更すると
それがchangeイベントを発生させ・・
と繰り返しが起きるからじゃないですか?
回避するには
Application.EnableEvents=False
セル変更
Application.EnableEvents=True
とするとよいでしょう。
ネットで検索してみてください。
・ツリー全体表示

【80997】Re:エクセル2016ですがクラッシュします
質問  goushi  - 19/7/5(金) 17:19 -

引用なし
パスワード
   新しいブックで確認したところ以下のコードが原因のようでした
イベントプロシージャの部分の
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Call 小計
End Sub

それを以下のように変更すると
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
Call 小計
End Sub

クラッシュしなくなりました
エクセル2013だと問題なく動くようなのですが
よろしければお教えいただけないでしょうか
・ツリー全体表示

【80996】VBAによる電圧自動測定
質問  ムズロウ E-MAIL  - 19/7/5(金) 0:18 -

引用なし
パスワード
   Agilent Technologies社の6 1/2 Degit Multimeter2台による電圧自動測定で、エラー9が出てしまい困っています。
コードの概略としましては1測定温度に対し、2出力の電圧を500回測定し、その平均を出しSheet1に記述していくというものです。

以下コード

Private Sub let_mesurement_Click()
  Dim i As Integer
  Dim j As Integer
  Dim DATA As Variant
  Dim TOTAL As Single
  Dim AVERAGE As Single
  Dim temp As Integer
  Dim count As Integer
  
  count = Sheet1.Cells(5, 11)
  
  temp = InputBox("測定温度は何℃ですか?", "温度確認")
  
  Dim new_Worksheets As Variant
  Set new_Worksheets = Worksheets.Add()
  new_Worksheets.Name = Str(temp) & "℃"
  
  Worksheets(new_Worksheets.Name).Cells(1, 1) = temp & "℃"
  Worksheets(new_Worksheets.Name).Cells(2, 3) = "平均出力電圧[V]"
  Worksheets(new_Worksheets.Name).Cells(1, 4) = "電圧1"
  Worksheets(new_Worksheets.Name).Cells(1, 5) = "電圧2"

  Dim RM As New VisaComLib.ResourceManager
  Dim DMM As New VisaComLib.FormattedIO488
    
  For i = 23 To 24
  
    Set DMM.IO = RM.Open("GPIB0::" & i & "::INSTR") '入力されたVISAアド                        レスにてセッションオープン
  
    DMM.IO.Timeout = 120000   'タイムアウト時間120秒に設定
    TOTAL = 0
    AVERAGE = 0
  
    With DMM
      .WriteString "*RST;*CLS" 'リセット、クリア
      .WriteString "CONF:VOLT:DC AUTO" ', 1E-5"  'DCV測定
      .WriteString "SENS:VOLT:DC:NPLC 0.5"  '積分時間を0.5PPLに設定
      .WriteString "TRIG:COUN 500"  'トリガカウント500回 34401Aの                       内部メモリの限界512回
      .WriteString "INIT"   '測定開始
      .WriteString "*OPC?"  '動作完了確認(ここでは測定の完了を確                       認)
      .ReadString        '測定が完了すると1 が返る
      .WriteString "FETC?"
      
      DATA = .ReadList(ASCIIType_R4, ",")
  
      For j = 0 To 499
       Worksheets(new_Worksheets.Name).Cells(j + 4, i - 19) = DATA(j)
        TOTAL = TOTAL + DATA(j)
      Next j
  
      .IO.Close
  
  End With
  
  Set DMM = Nothing
  Set RM = Nothing
  
  AVERAGE = TOTAL / 500
    
  Worksheets(new_Worksheets.Name).Cells(2, i - 19) = AVERAGE
  
  Next i
  
  Sheet1.Cells(count + 2, 1) = temp
  
  Sheet1.Cells(count + 2, 2) = Worksheets(new_Worksheets.Name).Cells(2, 4)
  Sheet1.Cells(count + 2, 3) = Worksheets(new_Worksheets.Name).Cells(2, 5)
  
  Sheet1.Cells(5, 11) = count + 1
  
  Set new_Worksheets = Nothing
  
  MsgBox "測定完了!"
  
End Sub

コード以上

変数iはGPIBのアドレスです
Worksheets(new_Worksheets.Name).Cells(j + 4, i - 19) = DATA(j)
の部分でエラーが出るようですが、うまく機能するときもあり原因が分かりません
当方VBAの知識はあまりなくコード自体も元あったものを少し書き換えた形になります。自分の勉強不足ではありますが、こちらに質問したほうが早いかと思い投稿させていただいた次第です。
自分でも調べてみますがどうぞよろしくお願いします。
・ツリー全体表示

【80995】Re:エクセル2016ですがクラッシュします
お礼  goushi  - 19/7/4(木) 23:07 -

引用なし
パスワード
   ありがとうございます
とりあえず新しいブックで再確認してみます
・ツリー全体表示

【80994】Re:エクセル2016ですがクラッシュします
発言  γ  - 19/7/4(木) 22:25 -

引用なし
パスワード
   そのコードがクラッシュの原因とは思えないですね。
その他のイベントプロシージャとか動いていませんか?
また、新しいブックで同じことをしても、クラッシュが再現しますか?
そのあたりを検討してみてはどうでしょうか。
・ツリー全体表示

【80993】エクセル2016ですがクラッシュします
質問  goushi  - 19/7/4(木) 18:05 -

引用なし
パスワード
   セルに数式を記入し隣のセルに答えが出るマクロをデータとしていただいたのですが最近答えが出てしばらくするとエクセルがクラッシュするようになりました。マクロ初心者ですのでどこが問題かわかりません。よろしくお願いいたします

Dim NowR As Integer
Dim NowC As Integer
Dim siki

Sub 小計()

 NowR = ActiveCell.Row
 NowC = ActiveCell.Column
 rr = Cells(NowR - 1, 4).Value
 If NowC = 4 And IsEmpty(Cells(NowR - 1, 4)) = False And rr <> "計" Then
  siki = Cells(NowR - 1, 4).Value
  Cells(NowR - 1, 5).Formula = "=ROUND(" & siki & ",2)"
 End If

End Sub
・ツリー全体表示

【80992】Re:数字の表示形式について
発言  マナ  - 19/7/2(火) 22:35 -

引用なし
パスワード
   ▼mikky さん:
>ご回答ありがとうございました。
>Round関数で四捨五入させて、それから表示形式を変えれば良いのですね。

そんな2度手間しなくても
γさんの回答の
表示形式を0".00"
でよいですよ。

表示形式、0 で四捨五入されるので、
その結果に固定の文字列、".00"を付加です。

頭の固いわたしには、思いつきませんでした。
・ツリー全体表示

【80991】Re:数字の表示形式について
お礼  mikky  - 19/7/2(火) 22:19 -

引用なし
パスワード
   ご回答ありがとうございました。
Round関数で四捨五入させて、それから表示形式を変えれば良いのですね。

444.6→445.00と変換しないといけないような特殊な入力箇所がありましたので
質問させていただきました。

ありがとうございました。

▼γ さん:
>▼マナ さん:
>>初めてみました。
>>勉強になります。
>> 
>
>そうですよねえ。普通こういう表示はしないですもん。
>
>444.6 → (変換)445.00とするのは反則技です。
>どうみても、445.00という表示は、
>444.995〜445.00499...の範囲の数値を表すと予測させますから、
>ミスリードさせる間違った使い方と言ってよいのではないでしょうか。
・ツリー全体表示

【80990】Re:数字の表示形式について
発言  γ  - 19/7/2(火) 21:14 -

引用なし
パスワード
   ▼マナ さん:
>初めてみました。
>勉強になります。
> 

そうですよねえ。普通こういう表示はしないですもん。

444.6 → (変換)445.00とするのは反則技です。
どうみても、445.00という表示は、
444.995〜445.00499...の範囲の数値を表すと予測させますから、
ミスリードさせる間違った使い方と言ってよいのではないでしょうか。
・ツリー全体表示

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