{"record":{"id":"236b4d619aaf91aa","repo":"PHPOffice/PhpSpreadsheet","slug":"column-is-outside-of-current-autofilter-range","errorCode":null,"errorMessage":"Column is outside of current autofilter range.","messagePattern":"Column is outside of current autofilter range\\.","errorType":"exception","errorClass":"PhpOffice\\PhpSpreadsheet\\Exception","httpStatus":null,"severity":"error","filePath":"src/PhpSpreadsheet/Worksheet/AutoFilter.php","lineNumber":185,"sourceCode":"    }\n\n    /**\n     * Validate that the specified column is in the AutoFilter range.\n     *\n     * @param string $column Column name (e.g. A)\n     *\n     * @return int The column offset within the autofilter range\n     */\n    public function testColumnInRange(string $column): int\n    {\n        if (empty($this->range)) {\n            throw new Exception('No autofilter range is defined.');\n        }\n\n        $columnIndex = Coordinate::columnIndexFromString($column);\n        [$rangeStart, $rangeEnd] = Coordinate::rangeBoundaries($this->range);\n        if (($rangeStart[0] > $columnIndex) || ($rangeEnd[0] < $columnIndex)) {\n            throw new Exception('Column is outside of current autofilter range.');\n        }\n\n        return $columnIndex - $rangeStart[0];\n    }\n\n    /**\n     * Get a specified AutoFilter Column Offset within the defined AutoFilter range.\n     *\n     * @param string $column Column name (e.g. A)\n     *\n     * @return int The offset of the specified column within the autofilter range\n     */\n    public function getColumnOffset(string $column): int\n    {\n        return $this->testColumnInRange($column);\n    }\n\n    /**","sourceCodeStart":167,"sourceCodeEnd":203,"githubUrl":"https://github.com/PHPOffice/PhpSpreadsheet/blob/65b080eef4d9fd11a5796135ab145883e5c3d6a6/src/PhpSpreadsheet/Worksheet/AutoFilter.php#L167-L203","documentation":"testColumnInRange() converts the column letter to a numeric index and verifies it lies between the first and last column of the current AutoFilter range. A column left or right of that range cannot hold filter rules, so the request is rejected.","triggerScenarios":"$autoFilter->getColumn('G')->createRule() or getColumnOffset('G') while the range is A1:F20; any column access outside rangeBoundaries() of the current range.","commonSituations":"Hard-coded column letters that no longer fit after the sheet layout changed; loops from 'A' to a fixed last column on sheets whose filter range is narrower.","solutions":["Use a column inside the current range, or widen the range first via setRange()","Pre-check: compare Coordinate::columnIndexFromString($col) against rangeBoundaries($autoFilter->getRange()) before access","Recompute the filter range from the sheet dimension before applying rules"],"exampleFix":"// before\n$autoFilter->getColumn('G')->createRule();\n\n// after\n[$start, $end] = \\PhpOffice\\PhpSpreadsheet\\Cell\\Coordinate::rangeBoundaries($autoFilter->getRange());\n$colIndex = \\PhpOffice\\PhpSpreadsheet\\Cell\\Coordinate::columnIndexFromString('G');\nif ($colIndex >= $start[0] && $colIndex <= $end[0]) {\n    $autoFilter->getColumn('G')->createRule();\n}","handlingStrategy":"validation","validationCode":"use PhpOffice\\PhpSpreadsheet\\Cell\\Coordinate;\n[$start, $end] = Coordinate::rangeBoundaries($autoFilter->getRange());\n$idx = Coordinate::columnIndexFromString($columnLetter);\nif ($idx < $start[0] || $idx > $end[0]) {\n    $autoFilter->setRange('A1:' . $columnLetter . $sheet->getHighestRow()); // widen\n}\n$autoFilter->getColumn($columnLetter);","typeGuard":null,"tryCatchPattern":"try {\n    $autoFilter->getColumn($columnLetter)->createRule();\n} catch (\\PhpOffice\\PhpSpreadsheet\\Exception $e) {\n    // column out of range: widen the filter range, then retry\n}","preventionTips":["Compute filter ranges from the real sheet dimension before adding rules","Prefer iterating existing autofilter columns over hard-coded letters"],"tags":["autofilter","column","bounds","range","phpspreadsheet"],"backgroundTag":"index-out-of-bounds","analyzedSha":"65b080eef4d9fd11a5796135ab145883e5c3d6a6","analyzedAt":"2026-08-17T05:40:41.646Z","schemaVersion":2},"datasetVersion":"2026-08-17T09:17:11.063Z"}