Excel VBA質問箱 IV

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

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


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

【78513】Re:「・」か改行などで区切られたセルを...
お礼  yk  - 16/10/24(月) 18:23 -

引用なし
パスワード
   β様、ありがとうございます!
書いていただいたコードで、まさにやりたかったことが完璧に再現できました!

今まで手作業で時間がかかり、VBAはまだ一部だけ調べて使ってみたりマクロの記録から少し変えたり程度しか分からなかったので、完璧に書いていただけて本当に助かりました。
感謝いたします。ありがとうございました。
・ツリー全体表示

【78512】Re:「・」か改行などで区切られたセルを...
発言  β  - 16/10/24(月) 16:58 -

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

★印、実際のシート名に変更願います。

Sub Sample()
  Dim dic As Object
  Dim c As Range
  Dim w1 As Variant
  Dim w2 As Variant
  Dim d1 As Variant
  Dim d2 As Variant
  
  Set dic = CreateObject("Scripting.Dictionary")
  
  With Sheets("Sheet1")  '★入力シート
    For Each c In .Range("A2", .Range("A" & Rows.Count).End(xlUp))
      w1 = Split(c.Offset(, 1).Value, "・")
      w2 = Split(c.Offset(, 2).Value, "・")
      If UBound(w1) >= 0 Or UBound(w2) >= 0 Then 'どちらかあれば
        If UBound(w1) < 0 Then w1 = Array(Empty)
        If UBound(w2) < 0 Then w2 = Array(Empty)
        For Each d1 In w1
          For Each d2 In w2
            dic(dic.Count) = Array(c.Value, d1, d2)
          Next
        Next
      End If
    Next
  End With
  
  With Sheets("Sheet2")  '★別シート
    .UsedRange.Offset(1).ClearContents 'タイトル行以外クリア
    .Range("A2").Resize(dic.Count, 3).Value = WorksheetFunction.Transpose(WorksheetFunction.Transpose(dic.items))
    On Error Resume Next
    .Range("A2", .Range("A" & Rows.Count).End(xlUp)).Offset(, 1).SpecialCells(xlCellTypeBlanks).Delete xlToLeft
    On Error GoTo 0
    .Select
  End With
  
End Sub
・ツリー全体表示

【78511】Re:「・」か改行などで区切られたセルを...
発言  yk  - 16/10/24(月) 16:02 -

引用なし
パスワード
   ありがとうございます。

行ごと(1品番ごと)に入力例AだったりBだったりの混在ではなく、
全て入力例Aで入力しています。

入力例Aが、セルA列〜C列を使っているとしたら、入力例Bは同じシートの同じ行でセルE列以降に数式を使ってセル内改行のBの状態にして列のテキスト保存などを試した入力例でしたが、
ややこしいので入力例Bはないものとして無視して構いません。

入力例Aの1品番で1行の状態から、1品番が複数行になる完成例にする方法がございましたらお願いします。


【入力】   色      サイズ(入力シート)
XXX-001  | 黒・白・茶| S・M・L
XXX-002  |      | M・L
XXX-003  |      | 
XXX-004  | 赤・緑  |



【完成】 選択1 選択2 (別のシート)
XXX-001 |黒| S
XXX-001 |黒| M
XXX-001 |黒| L
XXX-001 |白| S
XXX-001 |白| M
XXX-001 |白| L
XXX-001 |茶| S
XXX-001 |茶| M
XXX-001 |茶| L
XXX-002 |M |
XXX-002 |L |
XXX-004 |赤|
XXX-004 |緑|

※色がなくサイズだけのXXX-002は選択1の列にサイズ内容が入る
※色もサイズもないXXX-003は載らない


このような説明で分かりますでしょうか?
説明が下手ですみません。

入力の仕方が悪く完成形にするのが難しい場合は、1商品1行でしたらある程度変更も可能です。
(カラー列・サイズ列にすると空欄が出る商品もあるので、それが支障になる場合は、元からカラーの列にサイズ内容を入れる、など)


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

【78510】Re:「・」か改行などで区切られたセルを...
発言  β  - 16/10/24(月) 13:03 -

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

A形式であれB形式であれ、最終形に変換するのはいかようにもできます。
ただし、1つのシートに、行ごとにA形式だ、B形式だと混在しているとすれば
その行が、どちらの形式なのかを判定しなければいけませんよね。

その判定基準は?
どこの列のどんな状態を見て、それがこうだったらA形式、それがこうだったらB形式だというルールを
言葉で提示いただけますか?
・ツリー全体表示

【78509】Re:「・」か改行などで区切られたセルを...
発言  yk  - 16/10/24(月) 10:32 -

引用なし
パスワード
   分かりづらくてすみません。
現在は、元の入力形式Aは列アルファベット前半に直接情報入力、
B形式は列アルファベット後半にA形式を数式で表示変更したもので
1つのシートに両方入って試行錯誤中です。

どちらかの形式、または他の形式に変えても、「1品番1行」に入れた入力情報から、
別のシートに1品番複数行の「完成形」を作れたらと思っています。

何かアイデアございましたら宜しくお願いします。
・ツリー全体表示

【78508】Re:「・」か改行などで区切られたセルを...
発言  β  - 16/10/24(月) 9:18 -

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

1つのシートが行によって、A形式だったりB形式だったりするということではなく
A形式のものをを完成形の形に、B形式のものを完成形の形にと
ようは2つのコードを要望しておられるのですね?
・ツリー全体表示

【78507】「・」か改行などで区切られたセルを縦の...
質問  yk  - 16/10/24(月) 0:30 -

引用なし
パスワード
   お世話になります。
「・」や改行で区切られた2項目のデータを、縦の行ごとに区切ったEXCELにしたいのですが、

【入力例A】

| A    | B        | C    |
-----------------------------------------------------
1|品番   | カラー     | サイズ
-----------------------------------------------------
2|XYZ-001  | ブラウン・グレー| 
-----------------------------------------------------
3|XYS-002  | カーキ・白・黒 |S・M・L
-----------------------------------------------------
4|XYZ-123  |          |S・M・L
-----------------------------------------------------
5|XYZ-999  |         |
-----------------------------------------------------
6|XYZ-456  | ピンク・グリーン|
-----------------------------------------------------
※別の列に下図「入力例B」のように項目名1・項目名2の列もあり。


または
【入力例B】(セル内改行)※Aのデータをもとに、数式を使い試行錯誤途中のセルの状態。

| A    | B        | C    | D
-----------------------------------------------------
1| 項目名1| 値1      | 項目名2| 値2
-----------------------------------------------------
2| カラー | XYZ-001 ブラウン|     |
|     | XYZ-001 グレー |     |
-----------------------------------------------------        
3| カラー | XYZ-002 カーキ | サイズ | S
|     | XYZ-002 白   |     | M
|     | XYZ-002 黒   |     | L
-----------------------------------------------------
4| サイズ | XYZ-123 S   |      |
|     | XYZ-123 M   |      |
|     | XYZ-123 L   |      |
-----------------------------------------------------
※カラーがなくサイズがあるものは、値1に詰める。

↑のようなエクセルの入力状態を下図のようにしたいのですが、

【完成図例】
※全てを「行」に分けて、値2があれば品番と値1をコピーして行が増える
| A    | B    | C    | 
-----------------------------------------------------
1| 品番  | 値1  |  値2
-----------------------------------------------------
2| XYZ-001 | ブラウン |     |
-----------------------------------------------------
3| XYZ-001 | グレー |     |
-----------------------------------------------------
4| XYZ-002 | カーキ |  S
-----------------------------------------------------
5| XYZ-002 | カーキ |  M
-----------------------------------------------------
6| XYZ-002 | カーキ |  L
-----------------------------------------------------
7| XYZ-002 | 白   |  S
-----------------------------------------------------
8| XYZ-002 | 白   |  M
-----------------------------------------------------
9| XYZ-002 | 白   |  L
-----------------------------------------------------
10| XYZ-002 | 黒   |  S
-----------------------------------------------------
11| XYZ-002 | 黒   |  M
-----------------------------------------------------
12| XYZ-002 | 黒   |  L
-----------------------------------------------------
13| XYZ-123 |  S   |      |
-----------------------------------------------------
14| XYZ-123 |  M   |      |
-----------------------------------------------------
15| XYZ-123 |  L   |      |
-----------------------------------------------------
16 XYZ-456〜

【入力例B】の状態から、B列のみだったら、列選択で別のシートに貼り付けて
テキスト形式で保存してエクセルで開くと、元のセル内改行が行ごとに改行された状態(B列部分のみ)ができたのですが、
値2も「完成図例」に入れられず行き詰まりました。

※例は全てA列からアルファベット順に書いていますが実際のファイルは余計な列も含まれています。


このような変更をしたい場合に、何か良いアイデアがございましたら教えてください。
宜しくお願いします。
・ツリー全体表示

【78506】Re:dowhileで複数条件を指定
発言  β  - 16/10/23(日) 19:23 -

引用なし
パスワード
   ▼マナ さん:
>▼山川 さん:
>
>And と Or で使い方を間違えている?
>ということはないでしょうか。

あぁ、もしかしたら、そういうことかも ですね。
・ツリー全体表示

【78505】Re:dowhileで複数条件を指定
発言  マナ  - 16/10/23(日) 18:58 -

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

And と Or で使い方を間違えている?
ということはないでしょうか。
・ツリー全体表示

【78504】Re:dowhileで複数条件を指定
発言  β  - 16/10/23(日) 15:30 -

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

>Do Whileで複数条件はもともと無理なのですか?

そんなことはありません。

たとえば、以下のコードを走らせてみてください、

Sub Test()
  Dim x As Long
  Dim y As Long
  Dim cnt As Long
  
  x = 10
  y = 9
  
  Do While x = 10 And y <> 20
    cnt = cnt + 1
    MsgBox cnt & "回目"
    If cnt = 3 Then y = 20
  Loop
  
End Sub

ステップ実行はご存知ですよね。
ステップ実行で、どのようにループするか(ループされないか)、その時の
Ws.Cells(I, 5).Value や UsrFrmQus.txtFil.Text や Ws.Cells(I, 1).Value
の値を見ながら確認されてはいかがでしょう。
・ツリー全体表示

【78503】dowhileで複数条件を指定
質問  山川  - 16/10/23(日) 14:05 -

引用なし
パスワード
   Do While Ws.Cells(I, 5).Value = False And UsrFrmQus.txtFil.Text <> Ws.Cells(I, 1).Value

で条件2つつけているにも関わらず、初めの条件しか聞いていません。
Do Whileで複数条件はもともと無理なのですか?
・ツリー全体表示

【78502】Re:FunctionからFunctionを呼び出すには
お礼  M.E  - 16/10/16(日) 17:33 -

引用なし
パスワード
   ▼β さん:
>変数の名前(含むプロシジャ名)には、命名ルールがあります。
>数字で始まるものはNGです。

早速のご返答、ありがとうございます。


2〜3日前からVBAに興味を持ち、ネットで調べながら独学を始めましたが、
「命名ルール」があることを見付けることが出来ませんでした。

β様のコメントのおかげで、一歩前に進めます。
頂いたアドバイスを元に、自分で作っているマクロを調整してみます。
(β様に記述いただいたものをmoduleへコピーして動作も試してみました。)

何度も、何度も壁にぶつかると思います。
その際には、また、この質問箱を頼らせていただこうと思います。

今後とも、どうぞよろしくお願い申し上げます。

本当に、ありがとうございました。
・ツリー全体表示

【78501】Re:FunctionからFunctionを呼び出すには
発言  β  - 16/10/16(日) 17:01 -

引用なし
パスワード
   ▼M.E さん:

こんな感じですかね。

Function 結果(入力値 As Double) As Double
  結果 = 十倍(入力値)
End Function

Function 十倍(入力値 As Double) As Double
  十倍 = 入力値 * 10
End Function

なお、変数の名前(含むプロシジャ名)には、命名ルールがあります。
数字で始まるものはNGです。
・ツリー全体表示

【78500】FunctionからFunctionを呼び出すには
質問  M.E  - 16/10/16(日) 16:02 -

引用なし
パスワード
   初めて質問させていただきます。

例えば以下のようなことを行いたいとします。
(Functionを呼び出さなくても出来ることは、理解していますが、例として)

 Function結果(入力値 as single)

  Function 10倍を呼び出して、入力値を10倍にする

  結果= 入力値を10倍にした値

 End Function

 ---------------------------------------------------

 Function 10倍(入力値 as single)

  10倍 = 10*入力値

 End Function

・Fanction結果の入力値から数字を入力(数字が入力されているCellを指定)
・Function10倍に入力値を渡し、数字を10倍
・Fanction結果の戻り値としてエクセルのCellへ結果を戻す

Function結果をユーザー定義から自作関数として使用したいと考えております。
Function 10倍も単独で自作関数として使用したいと考えております。

Callなど使って、自分で組んでみたのですが、記述の仕方が間違っているらしく
上手く機能してくれません。


ご助言いただければ幸いに存じます。
よろしくお願い申し上げます。
・ツリー全体表示

【78499】Re:ウィンドウ枠固定して、アクティブセ...
お礼  ムニ  - 16/10/11(火) 23:14 -

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

レスありがとうございます!
早速やってみます。
以下は自分で模索した結果です。
C4で枠固定したとして…
ボタンを押したら
range("C4").select
activewindow.smallscroll toRight:=21
いったんC4を選択、そこから右へ21セル目が左端にさせたい箇所

…何セル目か数えないといけないし、いったんC4セルを起点にして…のプログラムになるけれど、やりたいことはできそうかなと思いました。

>▼ムニ さん:
>
>具体的に、どの列とどの行で枠固定させているかが見えませんが
>たとえば、以下のコードは 画面がどんな状態であれ K列が可動領域の左端になります。
>
>Sub Test()
>  Application.Goto Range("K1"), True
>End Sub
・ツリー全体表示

【78498】Re:ウィンドウ枠固定して、アクティブセ...
発言  β  - 16/10/11(火) 22:05 -

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

具体的に、どの列とどの行で枠固定させているかが見えませんが
たとえば、以下のコードは 画面がどんな状態であれ K列が可動領域の左端になります。

Sub Test()
  Application.Goto Range("K1"), True
End Sub
・ツリー全体表示

【78497】ウィンドウ枠固定して、アクティブセルの...
質問  ムニ  - 16/10/11(火) 21:26 -

引用なし
パスワード
   1枚のシートに、横に長いデータ表があります。
列には各メーカーの製品一覧
横は12ヶ月の月ごと売り上げ金額、その横は前年比、その横に12ヶ月ごとの売り上げ個数、その横に前年比…のような。
とても長くなるので、ボタンを作って、押せば見たいデータ箇所を表示させるようにジャンプ(セル移動)プログラムをあてたいです。
ウィンドウ枠を固定させているので、固定された起点のセルのすぐ横にアクティブセルを移動させればいいのかと思うのですが、どのようにプログラムを書けばいいのがご教示いだだきたく、よろしくお願いします。
・ツリー全体表示

【78496】Re:ピボット作成
お礼  パニック  - 16/10/11(火) 11:23 -

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

有難うございました。
MyRow = Sheets("1.尺度ごとの集計").Range("A10000").End(xlUp).row

ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, _
                   SourceData:="1.尺度ごとの集計!R3C1:R" & MyRow & "C7" _
                   , version:=xlPivotTableVersion15).CreatePivotTable _
                   TableDestination:="Sheet2!R3C1", TableName:="部署", DefaultVersion _
                   :=xlPivotTableVersion15

とすることで解決しました。
有難うございます。
・ツリー全体表示

【78495】Re:ピボット作成
発言  マナ  - 16/10/9(日) 23:24 -

引用なし
パスワード
   ▼パニック さん:

ピボットと関係なく、初歩的なことが理解できていないのではと気になっています。

>Setでエラーになります。

の意味は、

>  'Range("A3:E3").Select
>  'Range(Selection, Selection.End(xlDown)).Select

だとエラーにならないのに

>  Set src = Sheets("1.尺度ごとの集計").Range("A3").CurrentRegion
 
setを使うとエラーになるということですか。

だとすると、CurrentRegionの意味を理解していますか。
2行目にデータがあると使えませんが、問題ないですか。
馬鹿にしないでというような、とても失礼なコメントになってしまってごめんなさい。

先のコメント通り、毎回ピボットを作成する必要性がわからないし、
今は、もっと基礎的で汎用性のあるものから取り組まれてはどうかと考えますが、
エラー原因をしっておくことは、大切だとも思います。
・ツリー全体表示

【78494】Re:画像をJPEGに変換
お礼  ちろ  - 16/10/9(日) 12:08 -

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

わざわざプログラムを書いていただきありがとうございます。
思い通りに動きましたヾ(感'∀'激)ノ゙

mosを使う事で画像サイス調整のプログラムもスマートになっており大変勉強になりました。


▼β さん:
>▼ちろ さん:
>
>とりあえず一例です。
>不具合あれば指摘願います。
>
>Sub Test()
>  Dim myRange As Range  '画像を配置するセル範囲
>  Dim myPic As Variant
>
>  Set myRange = ActiveCell.MergeArea  'このセル範囲に収まるように画像を縮小する
>  
>  myPic = Application.GetOpenFilename("画像ファイル,*.jpg;*.jpeg;*.gif;*.tif")
>  If VarType(myPic) = vbBoolean Then Exit Sub
>
>  With ActiveSheet.Pictures.Insert(myPic)
>    .ShapeRange.LockAspectRatio = msoTrue
>    .Cut
>    ActiveSheet.PasteSpecial Format:="図 (JPEG)", Link:=False, DisplayAsIcon:=False
>    DoEvents
>    With ActiveSheet.Shapes(ActiveSheet.Shapes.Count)
>      .Width = myRange.Width
>      If .Height > myRange.Height Then .Height = myRange.Height
>      .Top = myRange.Top + (myRange.Height - .Height) / 2
>      .Left = myRange.Left + (myRange.Width - .Width) / 2
>    End With
>  End With
>  
>End Sub
・ツリー全体表示

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