Excel VBA質問箱 IV

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

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


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

【77217】Re:2つの数式を一緒にしたい
発言  独覚  - 15/6/18(木) 10:29 -

引用なし
パスワード
   ▼かの さん:
ところでこの質問のどこら辺がVBAに関連しているのでしょうか?
・ツリー全体表示

【77216】Re:2つの数式を一緒にしたい
質問  かの  - 15/6/18(木) 10:03 -

引用なし
パスワード
   出来ました、ありがとうございます!!

だったのですが・・・
M以外の文字が出てくるものもあって上手くいかないものが
出てきてしましました。

Mの部分を文字列(数字以外)のものという風にするのは
可能なのでしょうか??

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

【77215】Re:2つの数式を一緒にしたい
発言  マナ  - 15/6/17(水) 19:32 -

引用なし
パスワード
   =LEFT(A1,IF(MID(A1,13,1)="M",12,13))

13文字目がMなら12文字目まで、それ以外は13文字目まで
・ツリー全体表示

【77214】Re:配列の有効数を求める(空白がある)
発言  kanabun  - 15/6/17(水) 18:20 -

引用なし
パスワード
   ▼まり さん:
>▼kanabun さん:
>
>>たとえば、
>>(1) ArrayData = Range("A1:F20").Value
>>
>>(2) ArrayData = Range("B1").CurrentRegion.Value
>>
>(3)行列の最終行を取得して、基点から最終までの範囲です。
>
>説明ができているか不安ですが、宜しくお願いします。

ありがとうございます。
コードにすると、どういったものですか?
・ツリー全体表示

【77213】Re:配列の有効数を求める(空白がある)
回答  まり  - 15/6/17(水) 18:11 -

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

>たとえば、
>(1) ArrayData = Range("A1:F20").Value
>
>(2) ArrayData = Range("B1").CurrentRegion.Value
>
(3)行列の最終行を取得して、基点から最終までの範囲です。

説明ができているか不安ですが、宜しくお願いします。
・ツリー全体表示

【77212】2つの数式を一緒にしたい
質問  かの  - 15/6/17(水) 18:08 -

引用なし
パスワード
   A1のセルには文字数が不確定のデータが入っており、
B1のセルに「=LEFT(A1,13)」で必要最低限の物を抜出し、
C1のセルに「=IF(RIGHT(B1,1)="M",SUBSTITUTE(B1,"M",""),B1)」
で、一番最後の文字が「M」だった場合は消去という作業をしています。

最終的に欲しいのはC1の12か13桁のデータ(Mの入っていないもの)なんですが
B1とC1で行っている作業を統合して一回の作業で終わらせることは
出来ますでしょうか?

※消去したい「M」が13か14桁目にあるため、上記のような作業をしています。
 ただ12桁以前にある「M」は必要なもので消去はしません。

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

【77211】Re:2つのマクロを1つにしたいのですが…。
お礼  レナレナ  - 15/6/17(水) 15:18 -

引用なし
パスワード
   うまくいきました。
ありがとうございます。
・ツリー全体表示

【77210】Re:2つのマクロを1つにしたいのですが…。
発言  β  - 15/6/17(水) 15:12 -

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

> 'A〜D列を非表示
> Columns("A:D").Hidden = True

ごめんなさい。
.Columns("A:D").Hidden = True と、 .(ピリオド)をつけてください。

> '1〜4行目を非表示
> Rows("1:4").Hidden = True

これも同様です。.Rows("1:4").Hidden = True
・ツリー全体表示

【77209】Re:2つのマクロを1つにしたいのですが…。
質問  レナレナ  - 15/6/17(水) 15:07 -

引用なし
パスワード
   ありがとうございます。
下記のように書き換え実行しました。
1点問題なのですが、sheetを基本にしているのに
'1〜4行目を非表示
 Rows("1:4").Hidden = True
'A〜D列を非表示
 Columns("A:D").Hidden = True
上記の部分が、アクティブシートでの実行になってしまうのは
なぜでしょうか?
教えてください。


Sub Test()
  Dim c As Range
  Dim i As Long

   Application.ScreenUpdating = False
 
   With Sheets("基本")
    .Rows.Hidden = False  'いったんすべて表示
     .Columns.Hidden = False 'いったんすべて表示
     '行の非表示
     For i = 9 To 126
      If .Cells(i, "GR").Value = 0 Then .Rows(i).Hidden = True
    Next
    '1〜4行目を非表示
    Rows("1:4").Hidden = True
     'A〜D列を非表示
     Columns("A:D").Hidden = True
    For Each c In .Range("E4:GW4")
      If c.Value = 1 Then c.EntireColumn.Hidden = True
    Next
  End With
 
End Sub
・ツリー全体表示

【77208】Re:配列の有効数を求める(空白がある)
発言  kanabun  - 15/6/17(水) 12:56 -

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


>回答を理解するのに時間がかかっております。
>もう少し時間をください。

了解です。

ただ、先だってのこちらからの質問にお返事もらうわけには
いきませんかね?

>「シートのセル範囲を 配列に どのように取り込んでいるか?」

たとえば、
(1) ArrayData = Range("A1:F20").Value

(2) ArrayData = Range("B1").CurrentRegion.Value

(3)

(1)のようなアドレス固定方式? あるいは (2)のように 表範囲指定方式?
それとも (1)とも (2)ともちがう方式?
・ツリー全体表示

【77207】Re:配列の有効数を求める(空白がある)
お礼  まり  - 15/6/17(水) 11:00 -

引用なし
パスワード
   皆様へ

返答できておらず申し訳ありません。

回答を理解するのに時間がかかっております。
もう少し時間をください。
・ツリー全体表示

【77206】Re:2つのマクロを1つにしたいのですが…。
発言  β  - 15/6/16(火) 19:37 -

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

スマートかどうかは別にして、2つのプロシジャでやっていることを1つのプロシジャで書けばよろしいかと。

Sub Test()
  Dim c As Range
  Dim i As Long
  
  Application.ScreenUpdating = False
  
  With Sheets("基本")
    .Rows.Hidden = False  'いったんすべて表示
    .Columns.Hidden = False 'いったんすべて表示
    '行の非表示
    For i = 9 To 126
      If .Cells(i, "GR").Value = 0 Then .Rows(i).Hidden = True
    Next
    '列の非表示
    'A〜D列を非表示
    Columns("A:D").Hidden = True
    For Each c In .Range("E4:GW4")
      If c.Value = 1 Then c.EntireColumn.Hidden = True
    Next
  End With
  
End Sub
・ツリー全体表示

【77205】2つのマクロを1つにしたいのですが…。
質問  レナレナ  - 15/6/16(火) 16:55 -

引用なし
パスワード
   このまま動かすとひとつひとつ動かすことになるのですが、
スマートにひとつの文にする方法を教えてください。

Option Explicit
Private Sub Cmd隠す_Click()
 Dim 行番号 As Long
 Application.ScreenUpdating = False
 '行を隠すGR列(行番号200)の総数量が0の時は行を非表示にする
 For 行番号 = 9 To 126
  If Cells(行番号, 200).Value = "0" Then
   Cells(行番号, 1).EntireRow.Hidden = True
  End If
 Next 行番号
 Application.ScreenUpdating = True
End Sub
Sub 行列非表示()
  Sheets("基本").Select
  'Dim wRow    As Integer
  'Dim W_Range   As Range
  Application.ScreenUpdating = False
  'A〜D列を非表示
   Columns("A:D").Hidden = True
  '4行目のセル値を判断。1であれば非表示、0であれば表示
   For Each W_Range In Range("E4:GW4")
    With W_Range
      Select Case .Value
          Case 1: .Columns.Hidden = True
          Case 0: .Columns.Hidden = False
      End Select
    End With
  Next
  '1〜4行目を非表示
   Rows("1:4").Hidden = True

  Application.ScreenUpdating = True
End Sub
・ツリー全体表示

【77204】Re:配列の有効数を求める(空白がある)
発言  β  - 15/6/16(火) 10:23 -

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

仮に ↑ のような要件であれば、以下のCompressArrayは配列を与え、その中の、完全空白列や
完全空白行を取り除き、小さな配列にするコードです。


Testでは、A1:F20 にあるデータを配列に入れ、それを圧縮して、H1 からの領域に落とし込んでいます。

Sub Test()  '空白行列の圧縮
  Dim v As Variant
  
  v = Range("A1:F20").Value  'テストデータ
  v = CompressArray(v, xlByColumns)
  v = CompressArray(v, xlByRows)
  
  MsgBox "有効行数:" & UBound(v, 1) & vbLf & "有効桁数:" & UBound(v, 2)
  
  Range("H1:M20").ClearContents
  Range("H1").Resize(UBound(v, 1), UBound(v, 2)).Value = v
  
End Sub

Function CompressArray(vnt As Variant, Optional by As XlSearchOrder = xlByRows) As Variant '空白列の圧縮
  'xlByRows  空白行を圧縮
  'xlByColumns 空白列を圧縮
  Dim t() As Variant
  Dim x As Long
  Dim y As Long
  Dim cnt As Long
  Dim pos As Long
  Dim v As Variant
  
  v = vnt
  If by = xlByRows Then v = WorksheetFunction.Transpose(v)
    
  ReDim t(0 To UBound(v, 2) - 1)
  pos = 0
  For y = 1 To UBound(v, 2)
    cnt = 0
    For x = 1 To UBound(v, 1)
      If Len(v(x, y)) > 0 Then Exit For
      cnt = cnt + 1
    Next
    If cnt <> UBound(v, 1) Then  '空白列
      t(pos) = y
      pos = pos + 1
    End If
  Next
  
  If pos = 0 Then
    CompressArray = vnt
  Else
    ReDim Preserve t(0 To pos - 1)
    CompressArray = Application.Index(v, Evaluate("row(1:" & UBound(v, 1) & ")"), t)
  End If
  
  If by = xlByRows Then CompressArray = WorksheetFunction.Transpose(CompressArray)

End Function
・ツリー全体表示

【77203】Re:配列の有効数を求める(空白がある)
発言  β  - 15/6/16(火) 10:09 -

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

おはようございます
アップされたコードでは、配列の1列目の最初の要素から値が連続して入っていて
どこかで空白要素があらわれれば、かりにそれ以降に値があってもそこで行のチェックは打ち切りうちきり。
列のチェックについても、1行目で同じ判定。
こんな流れですね?

やりたいことは、配列の1行全体が空白のものは【非有効】、どこなに何かしら値があれば【有効】。
列についても同様。

そういうことでしょうか?
・ツリー全体表示

【77202】Re:32ビット用APIエラー
発言  独覚  - 15/6/16(火) 9:46 -

引用なし
パスワード
   ▼明石屋たけし さん:
こちらは
Windows 7 Professional 32ビット
Excel 2010 32ビット
(提示されたVBAをしばらく走らせましたがエラーは発生しませんでした)
なのであとはExcel2013を使っている人の回答を待ちたいですね。

一応近々2013購入予定なのですがWindowsが7の64ビットになるため参考になるか不明です。
・ツリー全体表示

【77201】Re:配列の有効数を求める(空白がある)
発言  kanabun  - 15/6/15(月) 23:17 -

引用なし
パスワード
   いまアクティブなシートの[B1]セルを含む表範囲を配列に入れ、
指定シートに貼り付ける...

イメージとして、こんな処理を想定しましたが、いかがでしょうか?

Public Sub tryA()
 Dim ArrayData As Variant
 
 '表範囲を配列に取り込む
 ArrayData = Range("B1").CurrentRegion.Value
 
 'このBookのSheet1に配列データを貼りつける
 ArrayToSheet ArrayData, ThisWorkbook.Worksheets("Sheet1")

End Sub

'配列データを指定ワークシートの[A1]セルから貼り付け
Public Sub ArrayToSheet(ArrayData As Variant, ws As Excel.Worksheet)
 Dim RowNum As Long
 Dim ColNum As Long
 
 RowNum = UBound(ArrayData, 1)
 ColNum = UBound(ArrayData, 2)
 
 With ws
   .UsedRange.Clear
   .Cells(1).Resize(RowNum, ColNum).Value = ArrayData
 End With

End Sub
・ツリー全体表示

【77200】Re:配列の有効数を求める(空白がある)
発言  kanabun  - 15/6/15(月) 22:38 -

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

>仰るとおり、シート範囲を配列にしたものです。
>
>>もしそうだとしたら、いま、どのようなコードで範囲を配列に入れていますか?

>'配列をシートに書き込む
>Public Sub Array2Sheet(ArrayData As Variant, BookName As String, SheetName As String)
>

あ、いえ、お聞きしたのは

「シートのセル範囲を 配列に どのように取り込んでいるか?」

ということです。

たとえば、

ArrayData = Range("B1").Currentregion.Value

のような構文です。
・ツリー全体表示

【77199】Re:配列の有効数を求める(空白がある)
質問  まり  - 15/6/15(月) 20:28 -

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

>ともに、ArrayData という名の配列を送っていますが、
>この配列はシートの範囲を配列にしたものではないのですか?
仰るとおり、シート範囲を配列にしたものです。

>もしそうだとしたら、いま、どのようなコードで範囲を配列に入れていますか?
'配列をシートに書き込む
Public Sub Array2Sheet(ArrayData As Variant, BookName As String, SheetName As String)

Dim RowNum As Double
Dim ColNum As Double

RowNum = ArrayRow(ArrayData)
ColNum = ArrayColumn(ArrayData)

With Workbooks(BookName).Sheets(SheetName)
  .Cells.Clear
  .Range(.Cells(1, 1), .Cells(RowNum, ColNum)) = ArrayData
End With

End Sub


>データ型に注意しましょう。
>以下は2つとも Double ではなく、 Long型整数で十分ですよ
ご指摘ありがとうございます。
・ツリー全体表示

【77198】Re:配列の有効数を求める(空白がある)
発言  kanabun  - 15/6/15(月) 17:57 -

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

>シートを配列化→データ抽出

>B列は必ず値が入っております。
>
有効列数を求める関数 ArrayColumn
有効行数を求める関数 ArrayRow
ともに、ArrayData という名の配列を送っていますが、
この配列はシートの範囲を配列にしたものではないのですか?
もしそうだとしたら、いま、どのようなコードで範囲を配列に入れていますか?


あと、別件で、

データ型に注意しましょう。
以下は2つとも Double ではなく、 Long型整数で十分ですよ

>Public Function ArrayColumn(ArrayData As Variant) As Double

>Dim i As Double
・ツリー全体表示

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