Excel VBA質問箱 IV

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

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


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

【82085】VBA メール作成
質問  はら  - 22/10/18(火) 11:44 -

引用なし
パスワード
   名前が長い店名でメール作成を行おうとするとメール作成ができない状況です。
考えられる原因はなんでしょうか。
よろしくお願いします。
・ツリー全体表示

【82084】Re:色付きセル&数値入りセルの個数を数...
お礼  へっぽこです  - 22/10/17(月) 21:19 -

引用なし
パスワード
   また不明な点があると思いますのでその時はご教示ください。
・ツリー全体表示

【82083】Re:色付きセル&数値入りセルの個数を数...
お礼  へっぽこです  - 22/10/17(月) 21:15 -

引用なし
パスワード
   ▼マナ さん:
おお、私の長々とした記述に比べ、ずいぶんコンパクトに!
今、走らせてみましたがスッキリ動きました。

ReDimというステートメントなど見たこともないので調べてみましたが、
勉強不足で理解できませんでした。

また明朝、作成していただいたコードを読み解いてみようと思います。
ありがとうございました!
・ツリー全体表示

【82082】Re:色付きセル&数値入りセルの個数を数...
発言  マナ  - 22/10/17(月) 13:32 -

引用なし
パスワード
   Sub test()
  Dim rngF As Range, rngT As Range
  Dim dicX As Object, dicY As Object
  Dim w, k As Long
  Dim r As Range, c As Range
  Dim 作業 As String, 区分
  
  Set rngF = Range("R11:DI41")
  Set rngT = Range("F50:P69")
  ReDim w(1 To rngT.Rows.Count, 1 To rngT.Columns.Count)
  
  Set dicX = CreateObject("scripting.dictionary")
  Set dicY = CreateObject("scripting.dictionary")
  
  For k = 1 To rngT.Rows.Count
    作業 = rngT(k, -4).Value
    If 作業 <> "" Then dicY(作業) = k
  Next
  
  For k = 1 To rngT.Columns.Count Step 2
    区分 = rngT(-1, k).Interior.ColorIndex
    dicX(区分) = k
  Next
    
  For Each r In rngF.Rows
    作業 = ""
    For Each c In r.Cells
      区分 = c.Interior.ColorIndex
      If Not dicX.exists(区分) Then 区分 = xlNone
      If c.Value <> "" Then 作業 = c.Value
      If Not dicY.exists(作業) Then
        If 区分 <> xlNone Or 作業 <> "" Then
          Application.Goto c, -1
          MsgBox c.Address(0, 0) & "セルの作業番号不明"
          Exit Sub
        End If
      End If
      If c.Value <> "" Or 区分 <> xlNone Then
        w(dicY(作業), dicX(区分)) = w(dicY(作業), dicX(区分)) + 1
      End If
    Next
  Next
  
  rngT.Value = w
  
End Sub
・ツリー全体表示

【82081】Re:色付きセル&数値入りセルの個数を数...
発言  へっぽこです  - 22/10/17(月) 9:37 -

引用なし
パスワード
   ▼マナ さん:

>G,I,K,M,Oは各々隣のF,H,J,L,Nと結合されたセルとなっています。

追伸です。
上記列G,I,K,M,OとF,H,J,L,Nの結合は解除できると思います。
・ツリー全体表示

【82080】Re:色付きセル&数値入りセルの個数を数...
発言  へっぽこです  - 22/10/17(月) 8:26 -

引用なし
パスワード
   ▼マナ さん:

>集計結果を書き込む列(F,H,J,L,N,P)の
>隣の列(G,I,K,M,O,Q)には、何があるのでしょうか?

Q列は全て空欄です。
G,I,K,M,Oは各々隣のF,H,J,L,Nと結合されたセルとなっています。
・ツリー全体表示

【82079】Re:色付きセル&数値入りセルの個数を数...
発言  へっぽこです  - 22/10/14(金) 19:31 -

引用なし
パスワード
   ▼マナ さん:

>集計結果を書き込む列(F,H,J,L,N,P)の
>隣の列(G,I,K,M,O,Q)には、何があるのでしょうか?

個人PCから書き込んでいます。
すみません、明日明後日はテレワーク移動日のため月曜日に返信します。
・ツリー全体表示

【82078】Re:色付きセル&数値入りセルの個数を数...
発言  マナ  - 22/10/14(金) 17:11 -

引用なし
パスワード
   ▼へっぽこです さん:

集計結果を書き込む列(F,H,J,L,N,P)の
隣の列(G,I,K,M,O,Q)には、何があるのでしょうか?
・ツリー全体表示

【82077】Re:色付きセル&数値入りセルの個数を数...
発言  へっぽこです  - 22/10/14(金) 8:08 -

引用なし
パスワード
   記入漏れです。

Public rng As Range
Public selectRng As Range
Public iC As Integer
Public iR As Integer
・ツリー全体表示

【82076】Re:色付きセル&数値入りセルの個数を数...
質問  へっぽこです  - 22/10/14(金) 7:11 -

引用なし
パスワード
   ▼マナ さん:

>それを提示してください。

色々編集して現在は下記の通り。
以前ほどには処理に時間がかからなくなった気がします。

ただ、
(1)とても泥臭い処理を行っている気がします。
(2)連続作業番号削除がどんな場面でも正確に処理されるのか、が気になっています。

もっとスマートな方法があればご教授ください。

Function CountCcolorText(range_data As Range, criteriaC As Range, criteriaT As Range) As Long '指定した色のセル数_and_指定した文字セルのカウント
Dim datax As Range
Dim xcolor As Long
Dim xtext As String

Application.Volatile
CountCcolorText = 0

xcolor = criteriaC.Interior.ColorIndex
xtext = criteriaT.Value

For Each datax In range_data
  If datax.Interior.ColorIndex = xcolor And datax.Value = xtext Then
   CountCcolorText = CountCcolorText + 1
  End If
Next datax
End Function


Sub 作業番号連続コピー()
  Sheets("月間ユニット集計").Activate
'***********************************************************************
'色の付いているセルだけを選択する
  For Each rng In Range("R11:DI41")
   If rng.Interior.ColorIndex <> xlNone Then 'セルに色が付いている場合
    If selectRng Is Nothing Then '最初にヒットした場合
     Set selectRng = rng
    Else
     Set selectRng = Application.Union(selectRng, rng) '色が付いているセルを選択範囲に追加していく
    End If
   End If
  Next rng
'***********************************************************************
'作業番号コピー
  For Each rng In selectRng '着色セル範囲内で
   If rng <> "" And rng.Offset(0, 1).Interior.ColorIndex <> xlNone And rng.Offset(0, 1) = "" Then 'セルに文字があり隣のセルが着色され,隣のセルが空欄の場合
    rng.Offset(0, 1).Value = rng
   ElseIf rng = "" And rng.Interior.ColorIndex <> xlNone Then 'セルに文字が無くセルが着色されている場合
    rng = rng.End(xlToLeft)
   End If

   If rng = Cells(rng.Row, "F") Or rng = Cells(rng.Row, "H") Or rng = Cells(rng.Row, "J") Or rng = Cells(rng.Row, "L") Or rng = Cells(rng.Row, "N") Or rng = Cells(rng.Row, "P") Then '列F,H,J,L,N,Pには別数値設定済
    rng.ClearContents
   End If
  Next rng
'***********************************************************************
'着色セルand数値セル集計
  For iR = 50 To 69
   If Cells(iR, 1) <> "" Then
    For iC = 6 To 14 Step 2
     Cells(iR, iC) = CountCcolorText(selectRng, Cells(48, iC), Cells(iR, 1)) 'セル(48, iC)には時間区分毎の設定色がせっていされています。
    Next iC
'無着色セルand数値セル集計
    Cells(iR, 16) = CountCcolorText(Range("R11:DI41"), Cells(48, 16), Cells(iR, 1)) 'セル(iR, 16)は作業番号有り、かつ無着色エラーの検出用。
   End If
  Next iR
End Sub

Sub 連続作業番号削除()
Application.ScreenUpdating = False
  Sheets("月間ユニット集計").Activate
   For iC = 113 To 18 Step -1
    For iR = 11 To 41
     If Cells(iR, iC) = Cells(iR, iC - 1) Then
      Cells(iR, iC).ClearContents
     End If
     If Cells(iR, iC) <> "" And Cells(iR, iC - 1) = "" And Cells(iR, iC) = Cells(iR, iC).End(xlToLeft) Then
      Cells(iR, iC).ClearContents
     End If
    Next iR
   Next iC
End Sub
・ツリー全体表示

【82075】Re:色付きセル&数値入りセルの個数を数...
発言  マナ  - 22/10/13(木) 14:17 -

引用なし
パスワード
   ▼へっぽこです さん:

>→処理時間が永遠かと思われるほどかかりました。

それを提示してください。
・ツリー全体表示

【82074】Re:色付きセル&数値入りセルの個数を数...
発言  へっぽこです  - 22/10/13(木) 9:03 -

引用なし
パスワード
   >(C1)作業者の入力ミスで物件番号の入ったセルの着色を消している。→ユニット数にはカウントされない。
>(C2)日の始まりの着色セルに物件番号を設定していない。→作業番号不明。

物件番号→作業番号と読み換えてください。
・ツリー全体表示

【82073】色付きセル&数値入りセルの個数を数えた...
質問  へっぽこです  - 22/10/13(木) 8:40 -

引用なし
パスワード
   建設業です。
毎月の作業内容毎のユニット(1ユニット=15分)を計算しています。
引き継がれている書式があり、その体裁は崩したくありません。

(A)入力セルについて
(A1)Sheets("月間ユニット集計")のRange("R18:DI41")に縦方向に31日、横方向に24時間(15分毎)に区切った月表があります。
(A2)月表は時間区分(定時間、時間外、深夜時間、休日、法定休日等々)にセル毎に色分けされています。
(A3)作業者は毎日当日の作業番号(6桁数値)をその作業の開始時間のセルに入力します。
(A4)1日の中で異なる作業が発生し、その都度作業番号を開始時間のセルに入力します。
(A5)作業が発生していない時間(昼休み、会議、出張等)は当該時間内のセルの色を無色にします。

(B)集計セルについて
(B1)Sheets("ユニット集計")のRange("A50:A69")に作業番号、Range("H50:N69")に時間区分が設定されています。
(B2)月の作業番号毎、時間区分毎のユニット数を月末に集計、入力します。

(C)留意すること
(C1)作業者の入力ミスで物件番号の入ったセルの着色を消している。→ユニット数にはカウントされない。
(C2)日の始まりの着色セルに物件番号を設定していない。→作業番号不明。
(C3)次の作業番号までの間のセルに無着色セルがある場合(A5)も次のセルが着色セル&空白なら続いて同じ作業番号のユニットとしてカウントする。

(D)VBAでしたいこと
(D1)(B2)の集計、入力を自動、かつ短時間で処理したい。
(D2)(C1)、(C2)の入力設定忘れをメッセージ表示したい。

(E)試したこと
作業番号が入力されたセルの作業番号を、異なる作業番号が入力されているセルまでコピペし、
セルの色毎にそれを集計。集計後同じ作業番号が続くセルをClearContents。
→処理時間が永遠かと思われるほどかかりました。

どなたかお知恵を貸してくれる方、いらっしゃいましたら宜しくお願いします。
・ツリー全体表示

【82072】Re:テーブルをやめる
お礼  りった  - 22/9/28(水) 22:17 -

引用なし
パスワード
   ありがとうございます!!
遅レスすみません m(_ _)m
・ツリー全体表示

【82071】Re:ユーザー関数(引数・戻り値とも配列)...
発言  ヘビー  - 22/9/23(金) 19:05 -

引用なし
パスワード
   変数名
C1,R1に似た物はPCによっては撥ねられます。
でもその内エラーにならなくなります。
ここが摩訶不思議。

Sub R()
a=0
End Sub

Sub C()
a=0
End Sub

Sub R1()
a=0
End Sub

Sub C1()
a=0
End Sub

なども、マクロマクロに表示され無い場合も。
でもその内表示されるようになります。
ここも摩訶不思議。
RとCは予約後らしい。
・ツリー全体表示

【82070】Re:ユーザー関数(引数・戻り値とも配列)...
発言  マナ  - 22/9/10(土) 10:26 -

引用なし
パスワード
   >p = Application.Transpose(Application.Transpose(p))

TypeName(p)="Range" のときだけでよかったかもしれません。
・ツリー全体表示

【82069】Re:ユーザー関数(引数・戻り値とも配列)...
発言  マナ  - 22/9/10(土) 10:16 -

引用なし
パスワード
   ▼popopo さん:

>再現できました。C1#が不可は不思議

これも、よくわかりませんが、エラーにはなりませんでした。

Public Function Pu(p As Variant) As Long()  '配列&Range受取・配列戻り
  p = Application.Transpose(Application.Transpose(p))
  Dim ret() As Long: ReDim ret(1 To UBound(p))
  ret(1) = p(1) + p(1) '和
  ret(2) = p(1) - p(2) '差
  Pu = ret
End Function
・ツリー全体表示

【82068】Re:ユーザー関数(引数・戻り値とも配列)...
質問  popopo  - 22/9/10(土) 2:25 -

引用なし
パスワード
   マナ さん、貴重なヒントありがとうございまうす。

再現できました。C1#が不可は不思議
足掛かりにして、もう少し反応を調べてみます。

=pu(pre(A1,B1)) '{57,0}スピル表示
=pu(C1#)    '#VALUE!
=pu(pre(A1,B1)) '{57,0}スピル表示
=pu(pre(A1,B1)) '{57,0}スピル表示

ユーザー関数では、以下限定の模様ですね
 ・引数はバリアント型
 ・配列はindex=1から
・ツリー全体表示

【82067】Re:ユーザー関数(引数・戻り値とも配列)...
発言  マナ  - 22/9/9(金) 22:26 -

引用なし
パスワード
   ▼popopo さん:

よくわかりませんが、これでエラーにはなりませんでした。

Public Function Pu(p() As Variant) As Long()  '配列受取・配列戻り
  Dim ret() As Long: ReDim ret(1 To UBound(p))
  ret(1) = p(1) + p(2) '和
  ret(2) = p(1) - p(2) '差
  Pu = ret
End Function。
・ツリー全体表示

【82066】ユーザー関数(引数・戻り値とも配列)にE...
質問  popopo E-MAIL  - 22/9/9(金) 17:57 -

引用なし
パスワード
   関数(引数・戻り値とも配列)を
Excelワークシートから配列を渡し、ユーザー関数として呼び出したい。
ご協力下さい。

・VBAコードからは、問題なく利用可能な関数Pu
・Excelワークシートから呼び出し不可。#VALUE!表示

・以下関数で挟み、VBAからは利用可能
 ・Pre_関数(引数:文字列 戻り値:配列)
 ・Post関数(引数:配列  戻り値:文字列)

◎・xPack関数(引数:文字列 戻り値:文字列):パッケージ シートからも利用可能
 種々関数を連結したく、高速化からも、直接呼出す方法はないでしょうか?
 宜しくお願い致します。

準備 A1=12, B1=45
結果
・C1=Pre(A1,B1)  '{12,45}スピル表示
・C2=Pu(Pre(B1,C1) '#VALUE!
・C3=Pu(C1#)    '#VALUE!
・C4=Pu({12,45})  '#VALUE!
・C5=Pu(Pre("12","45")) '#VALUE!

・C11=Post(Pre(A1,B1))  '#VALUE!
・C12=Post(Pu(Pre(B1,C1)))'#VALUE!
・C13=Post(Pu(C1#))    '#VALUE!
・C14=Post(Pu({12,45}))  '#VALUE!
・C15=Post(Pu(Pre("12","45"))) '#VALUE!

・C21=xPack(A1,B1) '-1881 正 パッケージ関数

不具合を再現する単純コード 演算内容は問わず
--
Public Function Pu(p() As Long) As Long() '配列受取・配列戻り
  Dim ret() As Long: ReDim ret(UBound(p))
  ret(0) = p(0) + p(1) '和
  ret(1) = p(0) - p(1) '差
  Pu = ret
End Function

Public Function Pre(S1 As String, S2 As String) As Long()'演算 配列戻り
  Dim ret() As Long: ReDim ret(1)
  ret(0) = CInt(S1)
  ret(1) = CInt(S2)
  Pre = ret
End Function

Public Function Post(p() As Long) As String '加工、戻り値文字列
  Post = p(0) * p(1) '積
End Function

Public Function xPack(S1 As String, S2 As String) As String '引数,戻り値文字列
  xPack = Post(Pu(Pre(S1, S2)))
End Function
---
・ツリー全体表示

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