Вставка місяців стовпців перед кварталами

Я працюю над проектом, де дані про продажі розбиті на квартали. Що мені потрібно зробити, перед кожним стовпцем вставте три місяці, які належать до цього кварталу. Я почав з виписки з конкретного випадку, але потім зрозумів, що це, мабуть, не найкращий спосіб це зробити. Що я хочу зробити - це бути змінним діапазоном (може бути щось, починаючи з 1-10 років), тому я встановив його для пошуку InStr для "Q1", "Q2", а потім вставте рядки та відповідні назви місяців . Я ще не вставляв назви місяців, тому що я хочу отримати перші рядки, але якщо у вас є пропозиція про те, як це зробити, не вказуючи значення клітинок, які також будуть чудовими! Варто також згадати, що ця вставка даних починається зі стовпця U і буде кожного разу. Дякуємо за будь-яку допомогу або пропозиції!

Sub InsertMonths()
If cell.value = InStr(1, cell, "Q1", 1) Then
    Dim y As String
    y = InStr(1, cell, "Q1", 1)
    If y = "" Then Exit Sub
    Dim x As Long
    For x = Cells(Columns.Count, 1).End(xlUp).Column To 1 Step -1
    If Cells(x, 18).value = y Then
    Columns(x + 3).Resize(1).Insert
    End If
    Next x
Else cell.value = InStr(1, cell, "Q2", 1) Then
    Dim y As String
    y = InStr(1, cell, "Q2", 1)
    If y = "" Then Exit Sub
    Dim x As Long
    For x = Cells(Columns.Count, 1).End(xlUp).Column To 1 Step -1
    If Cells(x, 18).value = y Then
    Columns(x + 3).Resize(1).Insert
    End If
    Next x
Else InStr(1, cell, "Q3", 1) then
    Dim y As String
    y = InStr(1, cell, "Q3", 1)
    If y = "" Then Exit Sub
    Dim x As Long
    For x = Cells(Columns.Count, 1).End(xlUp).Column To 1 Step -1
    If Cells(x, 18).value = y Then
    Columns(x + 3).Resize(1).Insert
    End If
    Next x
Else InStr(1, cell, "Q4", 1) then
    Dim y As String
    y = InStr(1, cell, "Q4", 1)
    If y = "" Then Exit Sub
    Dim x As Long
    For x = Cells(Columns.Count, 1).End(xlUp).Column To 1 Step -1
    If Cells(x, 18).value = y Then
    Columns(x + 3).Resize(1).Insert
    End If
    Next x
End If
End Sub
0
Гаразд, і чи використовуєте ви .NET чи vba? Ви маєте обидва теги.
додано Автор APrough, джерело
Вам потрібні місяці в окремих стовпцях або в одному стовпчику, але розділені комами?
додано Автор APrough, джерело
VBA, я візьму vb.net вниз. Просто звик працювати з ним, тому я позначив його, не думаючи. Моє ліжко!
додано Автор BrianCD24, джерело
Окремі стовпці, ми намагаємось пов'язати кількість з ним за той самий час, який організовується за місяць.
додано Автор BrianCD24, джерело

7 Відповіді

Не вдаючись до надто докладної інформації в конкретній ситуації, тут у вас є кілька циклів, що роблять те ж саме, що і ваш набір умов. Він готовий мати справу з якомога більшою кількістю клітинок (букви та інс).

Sub InsertMonths()

    Dim startInt, endInt, totLetters, lettersCount, curInt As Integer
    Dim allLetters(10), curLetter, curCell As String

    totLetters = 1
    allLetters(1) = "Q"


    startInt = 1
    endInt = 4

    lettersCount = 0
    Do
        lettersCount = lettersCount + 1
        curLetter = allLetters(lettersCount)

        curInt = startInt - 1
        Do
            curInt = curInt + 1

            curCell = curLetter & CStr(curInt)
            If cell.Value = InStr(1, cell, curCell, 1) Then
                Dim y As String
                y = InStr(1, cell, curCell, 1)
                If y = "" Then Exit Sub
                Dim x As Long
                For x = Cells(Columns.Count, 1).End(xlUp).Column To 1 Step -1
                If Cells(x, 18).Value = y Then
                Columns(x + 3).Resize(1).Insert
                End If
                Next x
            End If
        Loop While (curInt < endInt)
    Loop While (curLetter < totLetters)

End Sub
0
додано
Без проблем. Хоча проблема менш зрозуміла, тим складнішим є рішення. Ви можете піти далі і вибрати відповідь, яку ви виявили більш корисною, як правильну відповідь.
додано Автор varocarbas, джерело
Я не впевнений, що саме те, що ви шукаєте (те, що повинен містити перший рядок), але я складаю враження, що ви надмірно ускладнюєте речі. Значення значень ячейки дуже просте: Діапазон ("A1"). Значення або комірки (1, 1). Значення. Ви можете створити простий цикл, який проходить через значення колонці Q і отримує номер рядка комірки, що має цільове значення Також ви можете покластися на функцію .Find, але у вашій ситуації я б краще навчився користуватися циклами і правильно читати комірки, перш ніж перейти до більш складних функцій.
додано Автор varocarbas, джерело
Немає сумнівів у цьому.
додано Автор varocarbas, джерело
Я хочу вибачитися, я лінувався у публікації цього питання. Те, що я зробив, замінив всі FY лише за чверть, і це зробило набагато простіше. Ще раз спасибі, і вибачте, якщо вас турбує.
додано Автор BrianCD24, джерело
Так, ти знаєш, що вони кажуть. Практика досконала. Дякую за допомогу!
додано Автор BrianCD24, джерело
Я намагався трохи спростити його, але це, безумовно, поставило мене в правильному напрямку. Мені потрібно лише шукати у верхньому рядку, отже, де буде Qx. Я не можу цілком зрозуміти це, але, схоже, я зробив би змінну, а потім замінив cell.value змінною рядка. Cell.value = InStr (1, cell, curCell, 1) Тоді Dim x2 As Long For x2 = Cells (Columns.Count, 1). End (xlUp). Колони до 1-го кроку -1. Якщо клітинки (1, x) .value = curCell, то стовпці (x - 3). Resize (1). Insert End Якщо Next x2
додано Автор BrianCD24, джерело

Не вдаючись до надто докладної інформації в конкретній ситуації, тут у вас є кілька циклів, що роблять те ж саме, що і ваш набір умов. Він готовий мати справу з якомога більшою кількістю клітинок (букви та інс).

Sub InsertMonths()

    Dim startInt, endInt, totLetters, lettersCount, curInt As Integer
    Dim allLetters(10), curLetter, curCell As String

    totLetters = 1
    allLetters(1) = "Q"


    startInt = 1
    endInt = 4

    lettersCount = 0
    Do
        lettersCount = lettersCount + 1
        curLetter = allLetters(lettersCount)

        curInt = startInt - 1
        Do
            curInt = curInt + 1

            curCell = curLetter & CStr(curInt)
            If cell.Value = InStr(1, cell, curCell, 1) Then
                Dim y As String
                y = InStr(1, cell, curCell, 1)
                If y = "" Then Exit Sub
                Dim x As Long
                For x = Cells(Columns.Count, 1).End(xlUp).Column To 1 Step -1
                If Cells(x, 18).Value = y Then
                Columns(x + 3).Resize(1).Insert
                End If
                Next x
            End If
        Loop While (curInt < endInt)
    Loop While (curLetter < totLetters)

End Sub
0
додано
Я не впевнений, що саме те, що ви шукаєте (те, що повинен містити перший рядок), але я складаю враження, що ви надмірно ускладнюєте речі. Значення значень ячейки дуже просте: Діапазон ("A1"). Значення або комірки (1, 1). Значення. Ви можете створити простий цикл, який проходить через значення колонці Q і отримує номер рядка комірки, що має цільове значення Також ви можете покластися на функцію .Find, але у вашій ситуації я б краще навчився користуватися циклами і правильно читати комірки, перш ніж перейти до більш складних функцій.
додано Автор varocarbas, джерело
Без проблем. Хоча проблема менш зрозуміла, тим складнішим є рішення. Ви можете піти далі і вибрати відповідь, яку ви виявили більш корисною, як правильну відповідь.
додано Автор varocarbas, джерело
Немає сумнівів у цьому.
додано Автор varocarbas, джерело
Я хочу вибачитися, я лінувався у публікації цього питання. Те, що я зробив, замінив всі FY лише за чверть, і це зробило набагато простіше. Ще раз спасибі, і вибачте, якщо вас турбує.
додано Автор BrianCD24, джерело
Так, ти знаєш, що вони кажуть. Практика досконала. Дякую за допомогу!
додано Автор BrianCD24, джерело
Я намагався трохи спростити його, але це, безумовно, поставило мене в правильному напрямку. Мені потрібно лише шукати у верхньому рядку, отже, де буде Qx. Я не можу цілком зрозуміти це, але, схоже, я зробив би змінну, а потім замінив cell.value змінною рядка. Cell.value = InStr (1, cell, curCell, 1) Тоді Dim x2 As Long For x2 = Cells (Columns.Count, 1). End (xlUp). Колони до 1-го кроку -1. Якщо клітинки (1, x) .value = curCell, то стовпці (x - 3). Resize (1). Insert End Якщо Next x2
додано Автор BrianCD24, джерело

Не вдаючись до надто докладної інформації в конкретній ситуації, тут у вас є кілька циклів, що роблять те ж саме, що і ваш набір умов. Він готовий мати справу з якомога більшою кількістю клітинок (букви та інс).

Sub InsertMonths()

    Dim startInt, endInt, totLetters, lettersCount, curInt As Integer
    Dim allLetters(10), curLetter, curCell As String

    totLetters = 1
    allLetters(1) = "Q"


    startInt = 1
    endInt = 4

    lettersCount = 0
    Do
        lettersCount = lettersCount + 1
        curLetter = allLetters(lettersCount)

        curInt = startInt - 1
        Do
            curInt = curInt + 1

            curCell = curLetter & CStr(curInt)
            If cell.Value = InStr(1, cell, curCell, 1) Then
                Dim y As String
                y = InStr(1, cell, curCell, 1)
                If y = "" Then Exit Sub
                Dim x As Long
                For x = Cells(Columns.Count, 1).End(xlUp).Column To 1 Step -1
                If Cells(x, 18).Value = y Then
                Columns(x + 3).Resize(1).Insert
                End If
                Next x
            End If
        Loop While (curInt < endInt)
    Loop While (curLetter < totLetters)

End Sub
0
додано
Немає сумнівів у цьому.
додано Автор varocarbas, джерело
Без проблем. Хоча проблема менш зрозуміла, тим складнішим є рішення. Ви можете піти далі і вибрати відповідь, яку ви виявили більш корисною, як правильну відповідь.
додано Автор varocarbas, джерело
Я не впевнений, що саме те, що ви шукаєте (те, що повинен містити перший рядок), але я складаю враження, що ви надмірно ускладнюєте речі. Значення значень ячейки дуже просте: Діапазон ("A1"). Значення або комірки (1, 1). Значення. Ви можете створити простий цикл, який проходить через значення колонці Q і отримує номер рядка комірки, що має цільове значення Також ви можете покластися на функцію .Find, але у вашій ситуації я б краще навчився користуватися циклами і правильно читати комірки, перш ніж перейти до більш складних функцій.
додано Автор varocarbas, джерело
Я хочу вибачитися, я лінувався у публікації цього питання. Те, що я зробив, замінив всі FY лише за чверть, і це зробило набагато простіше. Ще раз спасибі, і вибачте, якщо вас турбує.
додано Автор BrianCD24, джерело
Так, ти знаєш, що вони кажуть. Практика досконала. Дякую за допомогу!
додано Автор BrianCD24, джерело
Я намагався трохи спростити його, але це, безумовно, поставило мене в правильному напрямку. Мені потрібно лише шукати у верхньому рядку, отже, де буде Qx. Я не можу цілком зрозуміти це, але, схоже, я зробив би змінну, а потім замінив cell.value змінною рядка. Cell.value = InStr (1, cell, curCell, 1) Тоді Dim x2 As Long For x2 = Cells (Columns.Count, 1). End (xlUp). Колони до 1-го кроку -1. Якщо клітинки (1, x) .value = curCell, то стовпці (x - 3). Resize (1). Insert End Якщо Next x2
додано Автор BrianCD24, джерело

Не вдаючись до надто докладної інформації в конкретній ситуації, тут у вас є кілька циклів, що роблять те ж саме, що і ваш набір умов. Він готовий мати справу з якомога більшою кількістю клітинок (букви та інс).

Sub InsertMonths()

    Dim startInt, endInt, totLetters, lettersCount, curInt As Integer
    Dim allLetters(10), curLetter, curCell As String

    totLetters = 1
    allLetters(1) = "Q"


    startInt = 1
    endInt = 4

    lettersCount = 0
    Do
        lettersCount = lettersCount + 1
        curLetter = allLetters(lettersCount)

        curInt = startInt - 1
        Do
            curInt = curInt + 1

            curCell = curLetter & CStr(curInt)
            If cell.Value = InStr(1, cell, curCell, 1) Then
                Dim y As String
                y = InStr(1, cell, curCell, 1)
                If y = "" Then Exit Sub
                Dim x As Long
                For x = Cells(Columns.Count, 1).End(xlUp).Column To 1 Step -1
                If Cells(x, 18).Value = y Then
                Columns(x + 3).Resize(1).Insert
                End If
                Next x
            End If
        Loop While (curInt < endInt)
    Loop While (curLetter < totLetters)

End Sub
0
додано
Немає сумнівів у цьому.
додано Автор varocarbas, джерело
Без проблем. Хоча проблема менш зрозуміла, тим складнішим є рішення. Ви можете піти далі і вибрати відповідь, яку ви виявили більш корисною, як правильну відповідь.
додано Автор varocarbas, джерело
Я не впевнений, що саме те, що ви шукаєте (те, що повинен містити перший рядок), але я складаю враження, що ви надмірно ускладнюєте речі. Значення значень ячейки дуже просте: Діапазон ("A1"). Значення або комірки (1, 1). Значення. Ви можете створити простий цикл, який проходить через значення колонці Q і отримує номер рядка комірки, що має цільове значення Також ви можете покластися на функцію .Find, але у вашій ситуації я б краще навчився користуватися циклами і правильно читати комірки, перш ніж перейти до більш складних функцій.
додано Автор varocarbas, джерело
Так, ти знаєш, що вони кажуть. Практика досконала. Дякую за допомогу!
додано Автор BrianCD24, джерело
Я хочу вибачитися, я лінувався у публікації цього питання. Те, що я зробив, замінив всі FY лише за чверть, і це зробило набагато простіше. Ще раз спасибі, і вибачте, якщо вас турбує.
додано Автор BrianCD24, джерело
Я намагався трохи спростити його, але це, безумовно, поставило мене в правильному напрямку. Мені потрібно лише шукати у верхньому рядку, отже, де буде Qx. Я не можу цілком зрозуміти це, але, схоже, я зробив би змінну, а потім замінив cell.value змінною рядка. Cell.value = InStr (1, cell, curCell, 1) Тоді Dim x2 As Long For x2 = Cells (Columns.Count, 1). End (xlUp). Колони до 1-го кроку -1. Якщо клітинки (1, x) .value = curCell, то стовпці (x - 3). Resize (1). Insert End Якщо Next x2
додано Автор BrianCD24, джерело

У своєму коді, де ви встановлюєте значення в комірці, щоб тримати місяць, введіть наступну формулу замість значення

Cells(x, y).value = "=(MID($D2,2,1) - 1) * 3 + 1"

Другий стовпець буде

Cells(x, y).value = "=(MID($D2,2,1) - 1) * 3 + 2"

І третій буде

Cells(x, y).value = "=(MID($D2,2,1) - 1) * 3 + 3"

У всіх випадках, зазначених вище, $ D2 має посилатися на клітинку, яку ви виявили, що містить "Q #". Формули в основному беруть чисельну частину кварталу та обчислюють 1, 2 та 3 місяці кварталу.

Також зауважте, що це дає вам номер місяця. Якщо ви хочете назви, ви повинні змогти зрозуміти це.

0
додано
Чудово, спасибі! Це, безумовно, буде робити трюк протягом декількох місяців ... Тепер я просто повинен з'ясувати, як правильно його зациклити.
додано Автор BrianCD24, джерело

У своєму коді, де ви встановлюєте значення в комірці, щоб тримати місяць, введіть наступну формулу замість значення

Cells(x, y).value = "=(MID($D2,2,1) - 1) * 3 + 1"

Другий стовпець буде

Cells(x, y).value = "=(MID($D2,2,1) - 1) * 3 + 2"

І третій буде

Cells(x, y).value = "=(MID($D2,2,1) - 1) * 3 + 3"

У всіх випадках, зазначених вище, $ D2 має посилатися на клітинку, яку ви виявили, що містить "Q #". Формули в основному беруть чисельну частину кварталу та обчислюють 1, 2 та 3 місяці кварталу.

Також зауважте, що це дає вам номер місяця. Якщо ви хочете назви, ви повинні змогти зрозуміти це.

0
додано
Чудово, спасибі! Це, безумовно, буде робити трюк протягом декількох місяців ... Тепер я просто повинен з'ясувати, як правильно його зациклити.
додано Автор BrianCD24, джерело

У своєму коді, де ви встановлюєте значення в комірці, щоб тримати місяць, введіть наступну формулу замість значення

Cells(x, y).value = "=(MID($D2,2,1) - 1) * 3 + 1"

Другий стовпець буде

Cells(x, y).value = "=(MID($D2,2,1) - 1) * 3 + 2"

І третій буде

Cells(x, y).value = "=(MID($D2,2,1) - 1) * 3 + 3"

У всіх випадках, зазначених вище, $ D2 має посилатися на клітинку, яку ви виявили, що містить "Q #". Формули в основному беруть чисельну частину кварталу та обчислюють 1, 2 та 3 місяці кварталу.

Також зауважте, що це дає вам номер місяця. Якщо ви хочете назви, ви повинні змогти зрозуміти це.

0
додано
Чудово, спасибі! Це, безумовно, буде робити трюк протягом декількох місяців ... Тепер я просто повинен з'ясувати, як правильно його зациклити.
додано Автор BrianCD24, джерело