Excel VBA質問箱 IV

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

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


1 / 3710 ページ 前へ→

【79833】複数条件での最大日付取得
質問[NEW]  tsujio  - 18/4/26(木) 7:14 -

引用なし
パスワード
   お世話になります。

以下のデータが入力された行が400行ほどあります。

---------------------------------
列番号  1    2     3
行番号    
 1   受注 商品送付 入金確認
 2   4/10  4/10   4/11
---------------------------------

ステータスは列番号1→2→3の順に進んでいきます。

上記表の場合、「最新ステータス」表示セルに「商品送付」と返したいのですが、
同じ日付が入力されていると行によっては「受注」が返されてしまいます。

現在、

WorksheetFunction.Max

を使用し、対象範囲には日付が入力されている2行目を指定しています。

これを複数条件、

「同じ日付があれば列番号の大きい方を返す(上記の図だと「商品送付」)」

としたいのですが、dmaxでいけるのでしょうか。

試してみましたがうまくいきませんでした。

「2行目の中で最大、かつ列番号が大きいほう」の値を取得するにはどういう書き方があるのでしょうか。

よろしくお願いいたします。


※1行目の「受注」「商品送付」「入金確認」にはEnumでそれぞれ「1」「2」「3」を割り当てています。
・ツリー全体表示

【79832】Re:セルの関数で使用している文字列を半...
回答  亀マスター  - 18/4/24(火) 20:50 -

引用なし
パスワード
   マナさんのおっしゃるように、エラーの可能性はあります。
特に、If関数などは条件が崩れると思いますよ。

それでもというなら、私なら以下のようにします。
(もっといい方法もあるかもしれませんが)

関数の中で文字列はダブルクォーテーションで囲んでいるはずなので、
これをVBAのInStrで検出し、2つのダブルクォーテーションで囲まれた
範囲だけを対象にStrConvで変換する・・・という考え方です。
これなら、参照しているシート名などはそのまま残ると思います。

Sub test()

Dim Rng As Range
Dim Pos1 As Long, Pos2 As Long
Dim tempStr As String, halfStr As String

For Each Rng In Selection
  '式があるかどうかを確認
  If Rng.HasFormula Then
    tempStr = Rng.FormulaLocal
    Pos2 = 0
    Do
      'ダブルクォーテーションの位置を検索
      Pos1 = InStr(Pos2 + 1, tempStr, """")
      '見つからなければループを抜ける
      If Pos1 = 0 Then
        Exit Do
      End If
      '次のダブルクォーテーションの位置を検索
      Pos2 = InStr(Pos1 + 1, tempStr, """")
      'ダブルクォーテーションで挟まれた文字列を抜き出し、半角に変換
      halfStr = StrConv(Mid(tempStr, Pos1 + 1, Pos2 - Pos1 - 1), vbNarrow)
      '変換後の文字列を元の位置に差し込む
      tempStr = Mid(tempStr, 1, Pos1) & halfStr & Mid(tempStr, Pos2)
    Loop  '次の位置のダブルクォーテーションが見つからなくなるまでループ
    '最終的に得られた数式を元のセルに戻す
    Rng.FormulaLocal = tempStr
  End If
Next Rng

End Sub
・ツリー全体表示

【79831】Re:セルの関数で使用している文字列を半...
発言  マナ  - 18/4/24(火) 18:57 -

引用なし
パスワード
   ▼りか さん:
>セルに
>=関数("文字列",シート1!A1)
>のように関数があるシートがあります。
>(関数、文字列と参照先はセルによってバラバラです)
>
>この関数の文字列の部分だけを半角(英数字とカナ)にし、
>セル参照のシート名はそのままにすることはできませんでしようか?
>

半角にした結果、そのセルを計算に使っているセルの結果が変わる
あるいは、えらーになるといった心配はありませんか。
・ツリー全体表示

【79830】Re:行番号の範囲の入った配列を使ってfi...
発言  マナ  - 18/4/24(火) 18:39 -

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

>複数条件でAND検索

具体例を挙げていただけますか
・ツリー全体表示

【79829】行番号の範囲の入った配列を使ってfindで...
質問  n  - 18/4/24(火) 17:39 -

引用なし
パスワード
   複数条件でAND検索(かつ大文字小文字区別)しようとしていて
その過程で、
検索で取得した行の範囲をRangeなどでまとめて
.findでまた検索かけるということをしたいです。

下記だとうまくいかないです。
どうすればいいでしょうか。。

For a = 0 To UBound(Dic) - 2
Set t = t & 接点.Cells(Dic(a), "B") & ","
Next a
Union(t).Select
・ツリー全体表示

【79828】セルの関数で使用している文字列を半角に...
質問  りか  - 18/4/24(火) 11:52 -

引用なし
パスワード
   セルに
=関数("文字列",シート1!A1)
のように関数があるシートがあります。
(関数、文字列と参照先はセルによってバラバラです)

この関数の文字列の部分だけを半角(英数字とカナ)にし、
セル参照のシート名はそのままにすることはできませんでしようか?

上司かシートに記入してある文字をすべて半角にできるものは
半角にしろと言われていて、置換ではやってられないので、
マクロに一気に処理したいのです。
直接文字が入力してあるだけのセルはValueをStrConvで変換すればよいのですが、
関数のセルのFormulaLocalをStrConvで変換すると、
参照している範囲の名称やシートの名前まで変換されてエラーとなってしまい
困っています。
・ツリー全体表示

【79827】セル入力の半角
質問  りか  - 18/4/24(火) 11:39 -

引用なし
パスワード
   セルに
=関数("文字列",シート1!A1)
のように関数があるシートがあります。
(関数、文字列と参照先はセルによってバラバラです)

この関数の文字列の部分だけを半角(英数字とカナ)にし、
セル参照のシート名はそのままにすることはできませんでしようか?

上司かシートに記入してある文字をすべて半角にできるものは
半角にしろと言われていて、置換ではやってられないので、
マクロに一気に処理したいのです。
・ツリー全体表示

【79826】Re:フォーマットを別シートからのデータ...
質問  そら  - 18/4/23(月) 16:01 -

引用なし
パスワード
   みなさま、色々とアドバイスいただきありがとうございます。。
自分で少し考えてみましたので、質問内容を変えてもよいでしょうか?

If Worksheets("まとめシート").Range("C3") = "" Then
Worksheets("まとめシート").Range("C3") = Worksheets("xxxxx").Range("C3")

上記の処理を以下のような形に持っていきたのですが、
どのような形にしたらよいのでしょうか?

1.Worksheets("xxxxx")の部分は、毎回シート名が違うため、
 Worksheets("まとめシート")の右隣のシートを参照するようにしたいです。

2.上記はC3の処理ですが、上記と同じようにまとめシートの方が空欄の場合、
 右隣のシートの同じセルのデータを貼り付ける、という処理を
 指定した範囲内で繰り返したいです。
 (C3:F1000と、I6:M1000、O4:R1000)

3.上記範囲内は、一部セルの結合がされているのですが、
 上手く貼り付けできるようにしたいです。
 (例:C3:C18、O4:Q10など)

何度も申し訳ありませんが、どうぞよろしくお願いいたします。
・ツリー全体表示

【79825】Re:フォーマットを別シートからのデータ...
お礼  そら  - 18/4/23(月) 15:51 -

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

ありがとうございます!
シートのフォーマットは、ちょっと複雑になっていて、
説明が難しいため、もし可能でしたら質問内容を変えますので、
そちらを確認いただいてもよいでしょうか・・?
申し訳ございません!


>▼そら さん:
>
>>項目が入った入力用フォーマットがあり、
>>フォーマットの一部分だけ入力されているシートが複数あります。
>>
>>一部だけ入力されたシートそれぞれから
>>統合用のフォーマットシート(入力欄はすべて空)を埋めていき、
>>すべての入力欄欄が埋まったシートを作成したい。
>
>シートのレイアウトを具体的に説明していただけますか。
>どんなフォーマットなのか全くイメージできません。
・ツリー全体表示

【79824】Re:フォーマットを別シートからのデータ...
お礼  そら  - 18/4/23(月) 15:31 -

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

ありがとうございます・・!
ただ私が初心者すぎて、上手く説明ができておらず申し訳ございません。。
数日間、再度自分で考えてみましたので、
再度、別途質問してもよいでしょうか・・?
もしよろしければアドバイスいただけますと幸いです。


>途中まで、
>
>Dim Shtb As Variant, sh As Worksheet,tt As Variant
>Shtb = Array("1111", "2222", "3333")
>On Error Resume Next
>For Each tt In Shtb
>  Set sh = Sheets(tt)
>  If Err Then
>    MsgBox tt & "が無い"
>  Else
>    If sh.Range("A1").Value = "" Then
>     MsgBox "シート" & tt & "のA1が空白の時の処理"
>    Else
>     MsgBox "シート" & tt & "のA1が空白で無い時の処理"
>    End If
>  End If
>  Err.Clear
>Next
>On Error GoTo 0
・ツリー全体表示

【79823】Re:フォーマットを別シートからのデータ...
発言  BJ  - 18/4/22(日) 23:02 -

引用なし
パスワード
   途中まで、

Dim Shtb As Variant, sh As Worksheet,tt As Variant
Shtb = Array("1111", "2222", "3333")
On Error Resume Next
For Each tt In Shtb
  Set sh = Sheets(tt)
  If Err Then
    MsgBox tt & "が無い"
  Else
    If sh.Range("A1").Value = "" Then
     MsgBox "シート" & tt & "のA1が空白の時の処理"
    Else
     MsgBox "シート" & tt & "のA1が空白で無い時の処理"
    End If
  End If
  Err.Clear
Next
On Error GoTo 0
・ツリー全体表示

【79822】Re:フォーマットを別シートからのデータ...
発言  マナ  - 18/4/20(金) 22:57 -

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

>項目が入った入力用フォーマットがあり、
>フォーマットの一部分だけ入力されているシートが複数あります。
>
>一部だけ入力されたシートそれぞれから
>統合用のフォーマットシート(入力欄はすべて空)を埋めていき、
>すべての入力欄欄が埋まったシートを作成したい。

シートのレイアウトを具体的に説明していただけますか。
どんなフォーマットなのか全くイメージできません。
・ツリー全体表示

【79821】Oracleをバージョンアップしたら不具合
質問  まいろねふ  - 18/4/20(金) 13:09 -

引用なし
パスワード
   客先の話ですが、Windowsを7から10に、Oracleを11gから12cにバージョンアップし、接続ミドルウェアをoo4oからADOに変更したところ、
SELECT文で選択したデータのうち、最初の100レコードだけ重複するエラーが発生したとの連絡がありました。

原因と対策を求めてネットを検索したところ、同様の環境で同様の現象が発生したという記事を1件だけ発見しましたが
DB接続時のプロバイダ名を「OraOLEDB.Oracle」から「MSDAORA」に変更したら直った旨の記述があったものの、現象の発生原因と直った理由までは書いてありませんでした。

そもそも自分のPC環境では現象自体が再現しない事もあり、何の根拠もなく「プロバイダ名を変えれば直る」
とは回答できない状況なので、
「なぜ100レコードだけ重複するのか」
「なぜプロバイダ名を変えたら直るのか」
の2点について、ご存知の方がおられましたら教えて頂ければ幸いです。よろしくお願い致します。

・Win7環境(正常に動作する)

OS:Windows7 pro sp1 32bit
Office:Excel2010 32bit
Oracle:11g


・Win10環境(正常に動作しない)

OS:Windows10 pro 64bit
Office:Excel2016 32bit
Oracle:12c
・ツリー全体表示

【79820】Re:VBAでcountifsを使用したい
お礼  ウメ  - 18/4/18(水) 22:29 -

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

返信ありがとうございます。説明が不十分で申し訳ありません。

詳細を記載しながら試行錯誤していたところ、自己解決しました。


お手数をおかけし大変申し訳ありません。
・ツリー全体表示

【79819】Re:VBAでcountifsを使用したい
発言  マナ  - 18/4/18(水) 19:39 -

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

>F2セルにその行で条件に合う(AND条件)ものをカウントしたいのですが
>文法で手間取っています。
>条件:A2>=1,B2>=2
>この場合、A2は"1"で、B2は"2"なので 1
>
>
>関数だと
>=COUNTIFS(A2:A2,">=1",B2:B2,">=2") で希望の結果になりましたが


どの範囲で、どんな条件でカウントしたいのか
上の説明を読んでもわかりません。

1行目の見タイトルとかC〜E列は全く関係ないのでしょうか。

もう一度、説明していただけますか
・ツリー全体表示

【79818】Re:商品の出荷開始月と終了月を求めたい
発言  マナ  - 18/4/18(水) 18:58 -

引用なし
パスワード
   ▼roo さん:
-
>現時点で丸2年分ありますが、これからも増える前提で表を作っています。

ということは、1行目の4月とか5月には、年の情報も含まれているのでしょうか?
それとも、必要なのは、開始「月」、終了「月」であって、
年までは不要なのでしょうか。
・ツリー全体表示

【79817】Re:VBA初心者です。ブック間の列コピーを...
お礼  atori  - 18/4/18(水) 16:11 -

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

>>For k = 1 To 999
>
>でなく、Do〜Loopを使う方法もあります。

kがはっきりしない場合だと見た目(?)としてはこっちのほうが良さそうですね、、、
でも確かに汎用性で考えるとFor使っておいたほうが安心みたいなところもありますね。ありがとうございます!
・ツリー全体表示

【79816】Re:フォーマットを別シートからのデータ...
質問  そら  - 18/4/18(水) 11:58 -

引用なし
パスワード
   ▼よろずや さん:
>>という流れで考えましたが、上手くできませんでした。
>それを提示すると回答が付くと思いますよ。


回答ありがとうございます!

----------------------------------
Sub test001()

Dim i As Long
i = 1
Do While Cells(i, 1) = ""
Cells(i, 1) = ※1111、2222、3333のシートいずれかのA1セル(データが入っているもの)
i = i + 1
Loop
End Sub
----------------------------------

超初心者のため、上記形でどうにかならないかと考えましたが、
お恥ずかしいことに、以下の点でつまづいています・・

1.上記、1111、2222、3333のシートの中で
 データが入っているシートのA1セルを指定する方法

2.1111、2222、3333のすべてのシートでA1セルが空欄だった場合は
 どうしたらよいのか

3.フォーマットのA列の最下行まで来たら、B列の1列目から同じ処理を繰り返す方法。

4.フォーマット内が一部セル結合されているため、上記の方法で上手くコピーできるのか?


そもそも上記の処理では効率が悪いもしくは難しいのでしょうか・・?
他によい方法があれば教えていただきたいです。
どうぞよろしくお願いいたします。
・ツリー全体表示

【79815】VBAでcountifsを使用したい
質問  ウメ  - 18/4/18(水) 9:47 -

引用なし
パスワード
   お世話になります。

1行目はタイトル行で
A2:E5まで数字が羅列してあるとして

A B C D E
a b c d e
1 2 4 0 9
2 1 5 9 1
1 0 7 1 3
2 1 3 4 3
2 4 1 5 2

F2セルにその行で条件に合う(AND条件)ものをカウントしたいのですが
文法で手間取っています。
条件:A2>=1,B2>=2
この場合、A2は"1"で、B2は"2"なので 1


関数だと
=COUNTIFS(A2:A2,">=1",B2:B2,">=2") で希望の結果になりましたが
VBAでの記載方法がわかりません。
変数を用いてF2〜F5まで処理を繰り返す予定です。

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

【79814】Re:商品の出荷開始月と終了月を求めたい
発言  roo  - 18/4/18(水) 9:15 -

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

レス・不明点の提示ありがとうございます。
解決はマクロを希望しています。

>1)どこに表示したいのでしょうか。
品番と月別データの間に列を挿入して表示したいと考えています。

>2)データは1年分でしょうか。
現時点で丸2年分ありますが、これからも増える前提で表を作っています。

>3)導入月が2回とか1回もないということもありますか。
ありえますが、導入月も廃番月も早い方を採用し、以降のデータは導入月や廃番月という目線では無視します。

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

1 / 3710 ページ 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free